在Java中操作TXT文件是常见的文件处理任务,涉及读取、写入和追加内容等操作,以下是详细实现方案,遵循最佳实践并兼顾代码健壮性:
读取TXT文件
方法1:使用 BufferedReader
(推荐大文件读取)
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class ReadTxtFile { public static void main(String[] args) { String filePath = "example.txt"; try (BufferedReader br = new BufferedReader(new FileReader(filePath))) { String line; while ((line = br.readLine()) != null) { System.out.println(line); // 逐行处理内容 } } catch (IOException e) { System.err.println("读取文件失败: " + e.getMessage()); } } }
- 优点:内存效率高,适合处理大型文件。
- 关键点:
try-with-resources
自动关闭资源,避免内存泄漏。
方法2:使用 Files
类(JDK7+,小文件首选)
import java.nio.file.Files; import java.nio.file.Paths; import java.util.List; public class ReadSmallFile { public static void main(String[] args) throws IOException { String filePath = "example.txt"; List<String> lines = Files.readAllLines(Paths.get(filePath)); lines.forEach(System.out::println); // 遍历所有行 } }
- 注意:一次性加载全部内容,文件过大可能导致
OutOfMemoryError
。
写入TXT文件
方法1:使用 BufferedWriter
(追加或覆盖内容)
import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; public class WriteTxtFile { public static void main(String[] args) { String filePath = "output.txt"; // 第二个参数 true 表示追加模式,false 表示覆盖 try (BufferedWriter bw = new BufferedWriter(new FileWriter(filePath, true))) { bw.write("第一行内容"); bw.newLine(); // 换行符 bw.write("第二行内容"); System.out.println("写入成功!"); } catch (IOException e) { System.err.println("写入失败: " + e.getMessage()); } } }
方法2:使用 Files
类(快速写入)
import java.nio.file.Files; import java.nio.file.Paths; import java.util.Arrays; import java.util.List; public class QuickWrite { public static void main(String[] args) throws IOException { String filePath = "output.txt"; List<String> lines = Arrays.asList("Line 1", "Line 2", "Line 3"); Files.write(Paths.get(filePath), lines); // 默认覆盖写入 } }
- 参数说明:
FileWriter(filePath, false)
:覆盖原文件(默认)。FileWriter(filePath, true)
:追加到文件末尾。
关键注意事项
-
字符编码处理:
- 指定UTF-8编码:使用
InputStreamReader
和OutputStreamWriter
。BufferedReader br = new BufferedReader( new InputStreamReader(new FileInputStream(filePath), StandardCharsets.UTF_8) );
- 指定UTF-8编码:使用
-
异常处理:
- 必须捕获
IOException
,避免程序崩溃。 - 使用
try-with-resources
确保流自动关闭。
- 必须捕获
-
路径问题:
- 相对路径:基于项目根目录(如
src/file.txt
)。 - 绝对路径:直接使用完整路径(如
C:/data/file.txt
),注意Linux/Windows差异。
- 相对路径:基于项目根目录(如
-
文件锁冲突:
写入时确保文件未被其他进程占用。
完整示例:读取+写入
import java.io.*; public class FileReadWrite { public static void main(String[] args) { String source = "source.txt"; String target = "target.txt"; try ( BufferedReader reader = new BufferedReader(new FileReader(source)); BufferedWriter writer = new BufferedWriter(new FileWriter(target)) ) { String line; while ((line = reader.readLine()) != null) { writer.write(line.toUpperCase()); // 转为大写并写入 writer.newLine(); } System.out.println("文件处理完成!"); } catch (IOException e) { System.err.println("操作异常: " + e.getMessage()); } } }
最佳实践总结
- 大文件:用
BufferedReader
/BufferedWriter
分块处理。 - 小文件:用
Files.readAllLines()
和Files.write()
简化代码。 - 异常捕获:始终处理
IOException
,记录错误日志。 - 资源释放:优先使用
try-with-resources
替代手动close()
。 - 编码统一:显式指定字符集(如UTF-8),避免乱码。
通过以上方法,可高效安全地操作TXT文件,实际开发中应根据需求选择读写策略,并严格管理文件资源。
引用说明:本文代码基于Oracle官方Java文档(JDK 17)及《Effective Java》第三版中I/O操作的最佳实践。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/15356.html