• fferedWriter:缓冲字符流(支持readLine()读取整行,newLine()换行);

  • InputStreamReader/OutputStreamWriter:转换流(字节流→字符流,可指定编码格式,如UTF-8)。

二、IO流实战技巧(避免踩坑)

1. 缓冲流的使用场景

无论字节流还是字符流,都建议包装成缓冲流使用。例如:用BufferedReader读取文本文件,比直接用FileReader快10倍以上,因为缓冲流会一次性读取多个字节/字符到缓冲区,减少与磁盘的交互次数。


// 缓冲字符流读取文本文件示例 try (BufferedReader br = new BufferedReader(new FileReader("test.txt"))) { String line; while ((line = br.readLine()) != null) { // 读取整行,效率高 System.out.println(line); } } catch (IOException e) { e.printStackTrace(); }

2. 编码格式的注意事项

读写文本文件时,务必指定编码格式(如UTF-8),避免中文乱码。FileReader/FileWriter默认使用系统编码(Windows是GBK,Linux是UTF-8),跨平台易乱码,推荐用转换流指定编码:


// 指定UTF-8编码读取文本文件 try (BufferedReader br = new BufferedReader( new InputStreamReader(new FileInputStream("test.txt"), "UTF-8"))) { // 业务逻辑 } catch (IOException e) { e.printStackTrace(); }

3. try-with-resources自动关闭流

JDK1.7后支持try-with-resources语法,可自动关闭实现AutoCloseable接口的资源(如IO流、Socket),无需手动调用close(),避免遗漏关闭导致资源泄露:

注意:多个资源用分号分隔,关闭顺序与声明顺序相反。

三、IO vs NIO(新IO)核心差异

Java NIO(JDK1.4引入)是对传统IO的优化,适用于高并发、大文件传输场景,核心差异如下:

对比维度

传统IO(BIO)

NIO

模型

同步阻塞(每连接对应一个线程)

同步非阻塞(单线程管理多个连接,基于Selector)

核心组件

流(Stream)

通道(Channel)、缓冲区(Buffer)、选择器(Selector)

数据处理

面向流(只能单向读取,如InputStream只能读)

面向缓冲区(可双向读写,数据先存入Buffer)

并发能力

低(线程开销大,支持连接数有限)

高(单线程处理多连接,适合高并发场景)

NIO核心组件说明

  • Channel:类似流,但可双向读写,支持非阻塞;常用实现类:FileChannel(文件通道)、SocketChannel(TCP客户端)、ServerSocketChannel(TCP服务端)。

  • Buffer:存储数据的缓冲区,所有数据都通过Buffer传输;常用实现类:ByteBuffer、CharBuffer、IntBuffer等。

  • Selector:选择器,单线程可监听多个Channel的事件(如连接、读、写),实现“单线程多通道”的非阻塞IO。

实战场景:传统IO适合简单的文件读写、低并发场景;NIO适合高并发网络编程(如Netty框架底层)、大文件传输场景。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐