使用Set集合配合文件读取剔除重复行,核心是利用Set自动去重特性,逐行trim()后判断并写入新文件,需指定UTF-8编码、统一换行符、用LinkedHashSet保序、BufferedWriter高效写入,并安全关闭流。

用 Set 集合配合文件读取剔除重复行,核心是利用 Set 的“自动去重”特性,边读边存、边写边过滤。关键在于保证行内容的精确一致(包括空格、换行符),避免因隐形字符导致去重失效。
读取时逐行处理,用 Set 记录已出现的行
打开源文件逐行读取,每读一行就 trim() 去首尾空白,再判断是否已在 Set 中存在。未出现则加入 Set 并写入新文件;已存在就跳过。这样既不占用大量内存(适合大文件),又确保逻辑清晰。
- 务必对每一行调用 line.trim(),否则 "abc" 和 "abc\n" 或 " abc " 会被视为不同行
- 若需保留原始换行格式(如 Windows 的 \r\n),建议先统一转为 \n 再处理,写入时按需还原
- 使用 LinkedHashSet 可保持首次出现的顺序,普通 HashSet 不保证顺序
写入结果到新文件,避免覆盖原文件
不要直接修改原文件,而是创建新文件写入去重后的内容。处理完成后再手动替换(或用 Files.move 安全替换),防止意外中断导致数据丢失。
- 用 BufferedWriter 写入,比 FileWriter 效率更高,尤其在大量行时
- 每写一行后调用 newLine(),确保跨平台换行符一致
- 记得在 finally 或 try-with-resources 中关闭流,防止资源泄漏
注意编码与特殊字符兼容性
中文、emoji、制表符等都可能影响去重结果。必须显式指定文件编码(如 UTF-8),否则默认平台编码可能导致乱码或误判重复。
- 读取时用 Files.lines(Paths.get("xxx"), StandardCharsets.UTF_8)
- 写入时用 Files.newBufferedWriter(Paths.get("out.txt"), StandardCharsets.UTF_8)
- 若文件含 BOM,可用 line.startsWith("\uFEFF") 判断并截掉,避免首行误判
小技巧:快速验证去重效果
处理前后分别统计行数和唯一行数,能直观确认是否生效。也可用命令行辅助验证(Linux/macOS):
- 原文件总行数: wc -l file.txt
- 去重后行数: sort file.txt | uniq | wc -l
- 对比差异: diff file.txt deduped.txt(可查看哪些行被删)

















