NIO 总结

核心部分:

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

你可能感兴趣的:(NIO 总结)