如何用Java移除文件空行并写回原文件?求代码优化方案
解决方案
一、完善现有代码:完成临时文件复制与删除
你当前的代码已经完成了读取原文件并将非空行写入临时文件的步骤,只需在关闭流后添加以下代码,即可将临时文件内容覆盖回原文件并删除临时文件:
import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.nio.file.Files; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; import java.util.Scanner; class Ask7 { public static void main(String[] args) throws IOException { File inpFile = new File("textFile.txt"); PrintWriter out = new PrintWriter("tempFile.txt"); Scanner in = new Scanner(inpFile); while(in.hasNextLine()) { String line = in.nextLine(); // 改成判断空白行(包括全空格/制表符的行),更符合题目的"空行"定义 if(!line.trim().isEmpty()) { out.println(line); } } in.close(); out.close(); // 复制临时文件到原文件,覆盖原有内容 Files.copy(Paths.get("tempFile.txt"), Paths.get("textFile.txt"), StandardCopyOption.REPLACE_EXISTING); // 删除临时文件 Files.delete(Paths.get("tempFile.txt")); } }
说明:
StandardCopyOption.REPLACE_EXISTING确保原文件被覆盖- 把原判断条件
line.length() > 0改成!line.trim().isEmpty(),可以过滤掉全是空格、制表符的空白行;如果用Java 11及以上版本,也可以用更简洁的!line.isBlank()
二、更优的实现方式(Java 8+)
利用Java NIO的Files工具类和流API,可以写出更简洁、可读性更强的代码,同时避免手动管理部分IO资源:
方式1:一次性读取(适合小文件)
import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; import java.util.List; import java.util.stream.Collectors; public class RemoveEmptyLines { public static void main(String[] args) throws IOException { String originalPath = "textFile.txt"; String tempPath = "tempFile.txt"; // 读取所有行,过滤空白行 List<String> nonEmptyLines = Files.readAllLines(Paths.get(originalPath)) .stream() .filter(line -> !line.trim().isEmpty()) // Java 11+可替换为!line.isBlank() .collect(Collectors.toList()); // Java 16+可简化为.toList() // 写入临时文件 Files.write(Paths.get(tempPath), nonEmptyLines); // 覆盖原文件并删除临时文件 Files.copy(Paths.get(tempPath), Paths.get(originalPath), StandardCopyOption.REPLACE_EXISTING); Files.delete(Paths.get(tempPath)); } }
方式2:流式读写(适合大文件,避免内存占用过高)
如果处理的文件很大,一次性读取所有行到内存会占用过多资源,推荐用流式读写:
import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; import java.nio.file.StandardOpenOption; public class RemoveEmptyLines { public static void main(String[] args) throws IOException { String originalPath = "textFile.txt"; String tempPath = "tempFile.txt"; // 自动关闭流(try-with-resources语法) try (var reader = Files.newBufferedReader(Paths.get(originalPath)); var writer = Files.newBufferedWriter(Paths.get(tempPath))) { String line; while ((line = reader.readLine()) != null) { if (!line.trim().isEmpty()) { writer.write(line); writer.newLine(); } } } // 覆盖原文件并删除临时文件 Files.copy(Paths.get(tempPath), Paths.get(originalPath), StandardCopyOption.REPLACE_EXISTING); Files.delete(Paths.get(tempPath)); } }
说明:
try-with-resources语法会自动关闭流,无需手动调用close(),避免资源泄漏- 流式读写逐行处理,内存占用稳定,适合大文件场景
内容的提问来源于stack exchange,提问作者Dimitris Malkotsis
相关产品推荐
相关产品推荐

