mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
584 字
2 分钟
Java IO操作详解
2026-02-03

Java的IO体系刚接触的时候觉得好庞大,各种InputStream、Reader傻傻分不清。后来搞懂了装饰器模式再看这些类的继承关系,一下子就豁然开朗了。这篇文章就从实用的角度出发,把常用的IO操作讲清楚。

Java IO操作详解#

IO操作#

IO(Input/Output)就是程序与外部设备之间的数据传输。刚开始学的时候觉得InputStream和Reader的继承关系太复杂了,后来发现记住一个原则就行:处理文本用字符流,处理二进制用字节流

IO流的分类#

  • 按流向:输入流(读)、输出流(写)
  • 按类型:字节流(处理所有数据)、字符流(处理文本)
  • 按功能:节点流(直接连数据源)、处理流(包装节点流,提供额外功能)

字节流#

核心类#

  • 输入InputStreamFileInputStreamBufferedInputStream
  • 输出OutputStreamFileOutputStreamBufferedOutputStream

文件读写示例#

// 读文件
try (FileInputStream fis = new FileInputStream("file.txt")) {
int data;
while ((data = fis.read()) != -1) {
System.out.print((char) data);
}
}
// 写文件
try (FileOutputStream fos = new FileOutputStream("output.txt")) {
String content = "Hello, Java IO!";
fos.write(content.getBytes());
}

缓冲流#

带缓冲区的流,效率更高。建议总是用缓冲流包装节点流:

try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("file.txt"))) {
// 读取效率更高
}

字符流#

核心类#

  • 输入ReaderFileReaderBufferedReader
  • 输出WriterFileWriterBufferedWriter

BufferedReader 按行读取#

try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}

这是最常用的读取文本文件的方式。

转换流#

InputStreamReaderOutputStreamWriter是字节流和字符流之间的桥梁。处理文本时一定要指定编码,否则会出现乱码。

// 指定UTF-8编码读取
try (InputStreamReader isr = new InputStreamReader(
new FileInputStream("file.txt"), "UTF-8")) {
// 读取
}

数据流#

DataInputStream/DataOutputStream可以读写基本数据类型:

try (DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.dat"))) {
dos.writeInt(100);
dos.writeDouble(3.14);
dos.writeUTF("Hello");
}

标准输入输出#

// 从控制台读取
try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
String name = br.readLine();
System.out.println("你好," + name);
}

File类#

用于操作文件或目录的路径,不是文件内容:

File file = new File("file.txt");
file.exists(); // 是否存在
file.isFile(); // 是否是文件
file.isDirectory(); // 是否是目录
file.getName(); // 文件名
file.length(); // 文件大小
file.createNewFile(); // 创建文件
file.delete(); // 删除
file.mkdirs(); // 创建多级目录

最佳实践#

  1. 用try-with-resources——自动关闭资源,不用写finally
  2. 选对流——文本用字符流,二进制用字节流
  3. 指定编码——跨平台时一定要指定,否则Windows和Linux编码不同会乱码。这个坑我踩过,在Windows上开发好好的,部署到Linux上全是乱码
  4. 用缓冲流——提高效率
  5. 简单的文件操作用NIO.2的Files类——Files.readAllBytes()Files.write() 一行搞定

💡 实战贴士: 如果只是简单的读写文件,用 java.nio.file.Files 类最省事。Files.readString(Path.of("file.txt")) 一行就能读完整个文件(Java 11+)。不需要自己折腾InputStream和BufferedReader。

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

部分信息可能已经过时

目录