java io流nio
时间: 2025-01-07 11:33:12 浏览: 5
### Java IO流与NIO使用教程及区别
#### 一、基本概念
Java 提供了两种主要的 I/O API:传统 IO 和 NIO。传统 IO 主要基于字节流和字符流,通过 `InputStream` 和 `OutputStream` 进行读写操作;而 NIO 则围绕着通道(Channel)、缓冲区(Buffer)和选择器(Selector),采用更高效的方式处理数据传输。
对于传统 IO 而言,其设计较为简单直观,适用于大多数常规文件或网络通信需求[^1]。然而,在面对大规模并发连接或者实时性强的应用场景时,则显得力不从心。相比之下,NIO 的非阻塞特性及其多路复用机制能够更好地满足这类特殊场合下的性能要求[^2]。
#### 二、具体实现方式
##### (一)传统 IO 流的操作方法
下面是一个简单的例子来展示如何利用传统的 FileInputSteam 来读取本地磁盘上的文本文件:
```java
import java.io.*;
public class TraditionalIOExample {
public static void main(String[] args) throws IOException {
String filePath = "example.txt";
try (FileInputStream fis = new FileInputStream(filePath);
InputStreamReader isr = new InputStreamReader(fis, StandardCharsets.UTF_8);
BufferedReader br = new BufferedReader(isr)) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
```
这段代码展示了怎样打开一个文件并逐行打印其中的内容。这里需要注意的是每次调用 readLine() 方法都会导致程序暂停执行直到有新的输入到达为止—这就是所谓的“阻塞性”。
##### (二)NIO 的应用实例
接下来再看一段关于 NIO 的示例代码,它同样实现了相同的功能但是采用了不同的思路:
```java
import java.nio.file.*;
import java.nio.charset.StandardCharsets;
public class NIOWithFilesExample {
public static void main(String[] args) throws Exception {
Path path = Paths.get("example.txt");
Files.lines(path, StandardCharsets.UTF_8).forEach(System.out::println);
}
}
```
此版本不仅更加简洁明了而且效率更高因为它是批量加载整个文档而不是一行一行地解析。更重要的是如果想要构建一个多线程服务器端应用程序的话那么就可以充分利用到 NIO 所提供的非阻塞特性和 Selector 组件从而大大提升系统的吞吐量[^3]。
#### 三、两者的主要差异点
| 特征 | Java IO | Java NIO |
| --- | --- | --- |
| 面向的对象 | 字符串/字节数组 | 缓冲区(Buffer) |
| 操作模式 | 阻塞式 | 支持非阻塞式 |
| 是否支持多路复用 | 否 | 是 |
上述表格清晰地概括出了二者之间最核心的区别之处[^4]。除此之外还有其他方面的不同比如资源管理方面等等。总体来说当涉及到高负载环境或者是需要频繁切换状态的任务时应该优先考虑使用 NIO 技术栈以获得更好的响应速度和服务质量。
阅读全文