java实现文件读写的核心在于根据场景选择合适的io流。1. 字节流(inputstream/outputstream)适合处理二进制文件如图片,字符流(reader/writer)适用于文本数据以避免编码问题;2. 使用fileinputstream和fileoutputstream进行二进制文件复制时建议配合缓冲区及try-with-resources语法提升效率;3. 处理文本文件推荐用filereader/filewriter结合bufferedreader/bufferedwriter减少io次数,注意filewriter默认覆盖写入且需手动添加换行符;4. java 7+可使用nio的files类简化操作,通过readalllines/write方法快速完成小文件的一次性读写任务,但不适合超大文件。掌握这些要点即可高效应对java文件读写需求。

Java实现文件读写主要依靠IO流(输入输出流)来完成。核心在于理解字节流和字符流的区别,并根据不同的场景选择合适的类进行操作。下面从基础到进阶,一步步带你了解Java中如何高效地进行文件的读写。

1. 基本概念:字节流 vs 字符流
Java的IO包中有两大类流:
-
字节流:用于处理二进制数据,比如图片、视频等,常用的类是
InputStream和OutputStream。 -
字符流:专门用于处理文本数据,比如
.txt文件,常用的是Reader和Writer。
简单来说:
立即学习“Java免费学习笔记(深入)”;

- 如果你处理的是非文本内容,用字节流;
- 如果是文本内容,推荐使用字符流,可以避免编码转换的问题。
2. 使用FileInputStream和FileOutputStream读写二进制文件
这两个类是最基础的字节流操作类。适合用来复制文件或者处理非文本数据。
举个例子,把一个文件的内容复制到另一个文件中:

try (FileInputStream fis = new FileInputStream("source.txt");
FileOutputStream fos = new FileOutputStream("dest.txt")) {
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
}几点说明:
-
try-with-resources语法可以自动关闭流,避免资源泄漏; - 缓冲区大小建议设置为1024或其倍数,效率更高;
- 每次读取后立即写入目标文件,适合大文件处理。
3. 使用FileReader和FileWriter处理文本文件
如果你要读写纯文本内容,比如日志、配置文件,用字符流会更方便。
例如读取一个文本文件并打印每一行:
try (FileReader reader = new FileReader("data.txt");
BufferedReader br = new BufferedReader(reader)) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}这里用了BufferedReader来提高读取效率,它有一个缓冲区,减少IO操作次数。
写入文本内容的例子:
try (FileWriter writer = new FileWriter("output.txt")) {
writer.write("这是第一行\n");
writer.write("这是第二行");
} catch (IOException e) {
e.printStackTrace();
}注意:
-
FileWriter默认是覆盖写入,如果想追加内容,可以传入第二个参数为true:new FileWriter("output.txt", true) - 写完记得换行符
\n,否则内容会在一行显示。
4. 使用NIO简化文件操作(Java 7+)
如果你用的是Java 7及以上版本,可以考虑使用NIO(New IO)包中的Files类,它封装了底层流操作,代码更简洁。
读取整个文件内容:
Listlines = Files.readAllLines(Paths.get("data.txt")); for (String line : lines) { System.out.println(line); }
写入内容:
Listcontent = Arrays.asList("第1行", "第2行", "第3行"); Files.write(Paths.get("output.txt"), content);
优点:
- 一行代码搞定读写;
- 自动处理缓冲和关闭资源;
- 更适合小文件或一次性读写的场景。
缺点:
- 不适合处理超大文件,因为是一次性加载全部内容到内存。
基本上就这些。Java的IO流体系虽然看起来多,但只要分清字节流和字符流,再结合具体需求选择合适的方式,就能轻松应对大多数文件读写任务。










