You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:42:41