核心部分:
Buffer、Channel、Selector
NIO操作面向缓冲区,数据从Channel读取到Buffer缓冲区,随后在Buffer 中处理数据。
NIO把它支持的I/O对象抽象为Channel,Channel 又称“通道”,类似于原I/O中的流(Stream)
1、流是单向的,通道是双向,可读可写
2、流读写是阻塞的,通道是可以异步读写
3、流中的数据是可以选择性的先读到缓存中,通道的数据总是要先读到一个缓存中,或 从缓存中写入
File file = new RandomAccessFile("data.txt", "rw");
FileChannel channel = file.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(48);
int bytesRead = channel.read(buffer);
while (bytesRead != -1) {
System.out.println("Read " + bytesRead);
buffer.flip();
while(buffer.hasRemaining()){
System.out.print((char) buffer.get());
}
buffer.clear();
bytesRead = channel.read(buffer);
}
file.close();
Channel能在非阻塞模式下运行。一个非阻塞模式下的Channel不会让调用线程睡眠。请求的操作要么立刻完成、要么返回一个结果告知什么都没做。
FileChannel是可读可写的Channel,它必须阻塞,不能用在非阻塞模式中。面向数据库I/O的非阻塞风格并不适合面向文件的操作。
FileChannel对象不能被直接创建。一个FileChannel实例只能通过在打开的文件对象(RandomAccessFile、FileInputStream、FileOutputStream)上调用getChannel()得到。
Selector 实现原理:
SocketChannel、ServerSocketChannel 和Selector 的实例初始化都通过SelectorProvider类实现
选择器(Selector)提供了挑选可用状态Channel的能力,从而实现多路复用的I/O。
IO:
流是一个数据的序列:一个程序使用输入流从一个源头读取数据;另一个程序使用输出流写入并发送数据到目的地。
InputStream、OutputStream、BufferInputStream、BUffeerOutputStream
网友评论