Java中如何结合双while循环实现文件内容去重并转存?
解决文件读写与连续重复单词去重的循环结合问题
嘿,我来帮你搞定这个循环结合的问题!你的核心思路没问题——读取文件每一行,去除连续重复单词(不区分大小写),再写入新文件。只是现在的代码里,去重逻辑和文件读写循环的结合有小瑕疵,而且正则替换的逻辑可以优化得更高效。
修正后的完整代码
import java.io.*; import java.util.regex.Matcher; import java.util.regex.Pattern; public class FileDeduplicator { public static void main(String[] args) throws IOException { // 定义文件目录 File dir = new File("C:/Users/PC/workspace/uplo/"); // 源文件路径 String source = dir.getCanonicalPath() + File.separator + "Output.txt"; // 目标文件路径 String dest = dir.getCanonicalPath() + File.separator + "Final.txt"; // 初始化输入输出流 File fin = new File(source); FileInputStream fis = new FileInputStream(fin); BufferedReader in = new BufferedReader(new InputStreamReader(fis, "UTF-8")); // 注:如果不需要追加内容,把第二个参数改成false(覆盖旧文件) OutputStreamWriter fstream = new OutputStreamWriter(new FileOutputStream(dest, false), "UTF-8"); BufferedWriter out = new BufferedWriter(fstream); // 把正则编译移到循环外,避免重复编译浪费性能 String regex = "\\b(\\w+)(\\s+\\1\\b)+"; Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); // 文件读取循环:逐行处理 String aLine = null; while ((aLine = in.readLine()) != null) { // 对当前行执行去重处理 Matcher m = p.matcher(aLine); // 用replaceAll一次性替换所有连续重复项,无需手动循环find String deduplicatedLine = m.replaceAll("$1"); // 写入处理后的行到目标文件 out.write(deduplicatedLine); out.newLine(); } // 关闭流(推荐用try-with-resources自动关闭,避免资源泄漏) in.close(); out.close(); } }
关键调整说明
- 正则编译优化:把
Pattern.compile移到文件读取循环外,避免每次读一行都重复编译正则表达式,提升运行效率。 - 去重逻辑简化:不需要手动写
while(m.find())逐个替换,直接用m.replaceAll("$1")就能一次性把所有连续重复的单词替换成单个单词($1对应正则里第一个捕获组的内容,也就是重复的目标单词)。 - 流的安全处理:如果用Java 7+,更推荐用
try-with-resources语法自动关闭流,避免忘记关闭导致的资源泄漏,示例如下:try (BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(fin), "UTF-8")); BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(dest, false), "UTF-8"))) { // 循环处理逻辑放在这里 } - 写入模式选择:
FileOutputStream(dest, true)是追加模式,如果希望每次运行都生成全新的目标文件,把第二个参数改成false即可。
测试效果
用你给出的示例文本:
Hello hello hello my name name Name is Arthur and I live in in Lithuania.
处理后会得到:
Hello my name is Arthur and I live in Lithuania.
完全符合你的期望效果!
内容的提问来源于stack exchange,提问作者Arnas Arnelis
相关产品推荐
相关产品推荐

