一、先表示一下_
Java IO | Java NIO | |
---|---|---|
主要特点 | 面向流(Stream)的I/O操作 | 面向缓冲区(Buffer)和通道(Channel)的I/O操作,支持非阻塞I/O和选择器(Selector) |
常用方法 | InputStream 、OutputStream 、Reader 、Writer 等 |
Channel (如FileChannel 、SocketChannel )、Buffer (如ByteBuffer )、Selector |
阻塞模式 | 阻塞模式,调用read/write方法时线程会阻塞 | 非阻塞模式,线程在等待数据期间可以继续执行其他任务 |
选择器(Selector) | 不支持 | 支持,可以监视多个通道的状态,提高I/O操作的效率 |
缓冲区(Buffer) | 缓冲区使用较少,数据直接通过流进行读写 | 使用缓冲区进行数据的读写,提高了数据处理的灵活性 |
适用场景 | 小文件读写、简单的网络通信等 | 大文件处理、高并发网络编程、需要高效I/O操作的场景 |
二、代码示例
Java IO示例(文件读取):
try (FileInputStream fis = new FileInputStream("file.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
InputStreamReader isr = new InputStreamReader(bis, StandardCharsets.UTF_8);
BufferedReader br = new BufferedReader(isr)) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
Java NIO示例(文件读取,使用缓冲区):
try (FileChannel fileChannel = FileChannel.open(Paths.get("file.txt"), StandardOpenOption.READ);
ByteBuffer buffer = ByteBuffer.allocate(1024)) {
while (fileChannel.read(buffer) != -1) {
buffer.flip(); // 切换为读模式
while (buffer.hasRemaining()) {
System.out.print((char) buffer.get());
}
buffer.clear(); // 准备下一次读取
}
} catch (IOException e) {
e.printStackTrace();
}
三、仔细聊聊
主要特点:
- Java IO:基于流的I/O操作,数据直接从流中读取或写入,不支持非阻塞I/O。
- Java NIO:基于缓冲区和通道的I/O操作,数据先读入缓冲区,再从缓冲区处理,支持非阻塞I/O和选择器机制,适合处理大量数据和高并发场景。
常用方法:
- Java IO:使用
InputStream
、OutputStream
、Reader
、Writer
等类进行数据的读写。 - Java NIO:使用
Channel
(如FileChannel
、SocketChannel
)进行数据的传输,Buffer
(如ByteBuffer
)作为数据容器,Selector
用于监视多个通道的状态。
- Java IO:使用
阻塞模式:
- Java IO:在调用read/write方法时,如果数据不可用或缓冲区已满,线程会阻塞,直到操作完成。
- Java NIO:提供了非阻塞模式,线程在等待数据期间可以继续执行其他任务,提高了程序的并发性能。
选择器(Selector):
- Java IO:不支持选择器机制,每个I/O操作都需要一个线程来处理。
- Java NIO:引入了选择器机制,可以监视多个通道的状态,当某个通道有数据可读或可写时,选择器会通知相应的线程进行处理,大大提高了I/O操作的效率。
缓冲区(Buffer):
- Java IO:虽然也使用缓冲区(如
BufferedInputStream
、BufferedOutputStream
),但这些缓冲区主要是为了减少系统调用次数和提高读写效率,并不是NIO中的核心概念。 - Java NIO:缓冲区是核心概念之一,数据在通道和应用程序之间通过缓冲区进行传输,提供了更灵活的数据处理方式。
- Java IO:虽然也使用缓冲区(如
适用场景:
- Java IO:适用于小文件读写、简单的网络通信等场景。
- Java NIO:适用于大文件处理、高并发网络编程、需要高效I/O操作的场景。
四、结尾
Java IO:
- 优点:简单易用,API直观。
- 缺点:阻塞模式导致性能瓶颈,不适合处理大量并发请求。
Java NIO:
- 优点:支持非阻塞I/O和选择器机制,提高了程序的并发性能和I/O操作效率;缓冲区机制提供了更灵活的数据处理方式。
- 缺点:编程模型相对复杂,在某些简单场景下可能不如Java IO直观易用。