Java文件读写核心是分清路径、数据、编码、性能四层次:File类仅定位文件;文本用字符流+显式UTF-8编码,二进制用字节流;资源必须关闭;推荐Files工具类简化操作。

直接上手别绕弯,Java文件读写学得顺的关键是分清“谁管路径、谁管数据、谁管编码、谁管性能”。不是背API,而是建立四个层次的认知链:File类定位文件 → 流选对类型(字节/字符)→ 编码不乱码 → 资源必须关。
先搞懂 File 类:它只管“在哪”,不管“内容”
File对象不是文件本身,只是操作系统里一个路径的快照。它能告诉你文件存不存在、是目录还是普通文件、大小多少、最后修改时间等,但不能读写一个字节。
- 创建时优先用 Paths.get("a", "b", "file.txt"),自动适配 Windows/Linux 分隔符,比硬写
"a\b\file.txt"或"a/b/file.txt"更可靠 -
exists()和isFile()一定要连用——因为目录也存在,但不是文件 - 创建文件前先确保父目录存在:
file.getParentFile().mkdirs(),否则createNewFile()可能静默失败
选对流:文本用字符流,图片用字节流
文本文件(.txt、.json、.xml、.java)必须用字符流(Reader/Writer),否则中文极大概率变 ???;二进制文件(.jpg、.pdf、.zip)必须用字节流(InputStream/OutputStream)。
- 读文本推荐组合:BufferedReader + Files.newBufferedReader(Paths.get(...), StandardCharsets.UTF_8) —— 显式指定编码,避免平台默认编码坑
- 写文本推荐组合:BufferedWriter + Files.newBufferedWriter(Paths.get(...), StandardCharsets.UTF_8) —— 支持追加(
StandardOpenOption.APPEND)和覆盖 - 读图片/音频等二进制文件,用 Files.readAllBytes(Paths.get(...))(小文件)或 FileInputStream + byte[] 缓冲区(大文件)
绕不开的编码问题:UTF-8 不写死就踩坑
FileReader/FileWriter 构造器不接受编码参数,默认用系统编码(Windows 是 GBK),Linux/macOS 是 UTF-8。同一段代码换环境就乱码,就是这里没设好。
立即学习“Java免费学习笔记(深入)”;
- 永远别用无参的
new FileReader("x.txt"),改用Files.newBufferedReader(path, UTF_8) - 写文件同理,别用
new FileWriter("x.txt"),改用Files.newBufferedWriter(path, UTF_8) - 如果必须用传统流(比如对接老代码),用
InputStreamReader(new FileInputStream(f), UTF_8)包一层
实战常用场景:三行代码搞定,但细节决定成败
日常开发中高频操作其实就几个,掌握模板+注意点就能覆盖 90% 需求:
-
读整个文本文件为字符串:
String content = Files.readString(Paths.get("a.txt"), UTF_8);(JDK11+,简洁安全) -
逐行处理大日志文件:用
Files.lines(path, UTF_8).forEach(...)或更省内存的BufferedReader循环,避免一次性加载进内存 -
追加一行日志:用
Files.newBufferedWriter(path, UTF_8, APPEND),注意换行符统一用bw.newLine() -
复制文件:直接
Files.copy(source, target, REPLACE_EXISTING),比手动流搬运更稳更快


















