Java NIO

一、NIO与传统IO

JDK1.4引入了新的IO(NIO),它与传统的IO主要的区别在于,NIO是面向块(缓存区),而传统的IO是面向流的,传统的IO是阻塞的,而NIO可以实现非阻塞,NIO的其他特性有内存映射文件、文件锁定、字符集编码和解码等

二、核心部分

NIO的核心组件包括:Channel、Buffer和Selector,其他如:Pipe和FileLock可以看成是NIO的工具类

Channel:NIO中有4种Channel,分别是

  1. FileChannel  : 用于文件的读写
  2. SocketChannel  :用于TCP读取网络数据
  3. ServerSocketChannel : 可以监听新连接的TCP,像Web服务器一样,每个新进来的连接都会创建一个SocketChannel
  4. DatagramChannel :用于UDP读取网络数据

Channel类似传统IO中的流(Stream),但是与流的不同之处在于:

  1. 流是单向传输的,比如文件读入流FileInputStream,对应有文件写出流FileOutputStream,但是NIO中的Channel是双向的,FileChannel既可以读入,也可以写出;
  2. 传统的IO中我们是直接操作流对象,进行读入和写出 ,但是在NIO中我们直接操作的对象不在是类似流的Channel,而是相应的Buffer;
  3. 传统IO的读写需同步,是阻塞的,而NIO中Channel可以异步读写。
Buffer : NIO中主要提供了8中Buffer,分别是
  1. ByteBuffer
  2. CharBuffer
  3. DoubleBuffer
  4. FloatBuffer
  5. IntBuffer
  6. LongBuffer
  7. ShortBuffer
  8. MappedbyteBuffer  (用于内存映射文件)
缓冲区(Buffer)实质上是一个数组。通常它是一个字节数组,但是也可以使用其他种类的数组。但是一个缓冲区不 仅仅 是一个数组。缓冲区提供了对数据的结构化访问,而且还可以跟踪系统的读/写进程
利用通道(Channel)和缓存区(Buffer)就可以实现简单的NIO文件读写。
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

public class SimpleRW {

	public static void main(String[] args) throws IOException{
		FileInputStream fis = new FileInputStream("e:\\test.txt");
		FileChannel channel = fis.getChannel();
		
		ByteBuffer buffer = ByteBuffer.allocate(128);
		
		int n = channel.read(buffer);
		while(n != -1) {
			System.out.println("Read:" + n);
			buffer.flip();
			while(buffer.hasRemaining()) {
				System.out.print((char)buffer.getChar());
			}
			buffer.clear();
			n = channel.read(buffer); 
		}
		fis.close();
	}
}


03-15
### Java NIO 教程与文档 Java NIO 是一种基于缓冲区和通道的 I/O 处理方式,相较于传统的 Java IO 更高效且适合处理大规模数据传输。以下是关于 Java NIO 的一些核心概念及其学习资源。 #### 1. **核心组件** Java NIO 主要由以下几个部分组成: - **Buffer**: 数据容器,用于存储不同类型的原始数据[^4]。 - **Channel**: 类似于流的概念,但支持双向读写操作。 - **Selector**: 支持多路复用机制,允许单线程管理多个 Channel。 这些组件共同构成了高效的非阻塞 I/O 模型,适用于网络编程和文件操作场景。 #### 2. **官方文档** Oracle 官方文档提供了详尽的 Java NIONIO.2 API 描述以及使用示例。可以通过访问 Oracle 官网并搜索 "Java SE documentation" 来获取最新的官方文档[^3]。 #### 3. **教程推荐** Baeldung 网站上的教程涵盖了 Java NIO 的基本原理及高级应用案例。例如,“Five ways to maximize Java NIO and NIO.2” 提供了五个重要的功能介绍,包括变更通知器(Change Notifiers),这使得监听事件变得更加简单。 #### 4. **实际应用场景** 通过结合实例代码可以更好地理解如何利用 Java NIO 实现高性能的数据传输。例如,在文件写入方面有多种实现方法,既可以直接采用标准库中的 `Files` 工具类,也可以借助更底层的 Buffer 和 Channel 结构完成复杂任务[^1]。 ```java import java.nio.file.*; import java.io.IOException; public class FileWriteExample { public static void main(String[] args) throws IOException { Path path = Paths.get("example.txt"); String content = "This is a test."; // 使用 Files.write 方法快速写入字符串到文件 Files.write(path, content.getBytes()); } } ``` 上述代码展示了如何利用 `Files.write()` 函数向指定路径下的文件写入一段文本内容。 --- ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值