NIO小结
1.NIO简介
I/O流(输入/输出流)指的是计算机与外部世界或者一个程序与计算机的其余部分的之间的接口。新的输入/
输出(NIO)库是在JDK 1.4中引入的。NIO弥补了原来的I/O的不足,它在标准Java代码中提供了高速的、面向块
的I/O。
原来的I/O库与NIO最重要的区别是数据打包和传输的方式的不同,原来的 I/O 以流的方式处理数据,而
NIO 以块的方式处理数据。
面向流的I/O系统一次一个字节地处理数据。一个输入流产生一个字节的数据,一个输出流消费一个字节的数
据。为流式数据创建过滤器非常容易。链接几个过滤器,以便每个过滤器只负责单个复杂处理机制的一部分,
这样也是相对简单的。不利的一面是,面向流的I/O通常相当慢。
NIO与原来的I/O有同样的作用和目的,但是它使用块I/O的处理方式。每一个操作都在一步中产生或者消费一
个数据块。按块处理数据比按(流式的)字节处理数据要快得多。但是面向块的I/O缺少一些面向流的I/O所具有的
优雅性和简单性。
2.NIO与普通(非阻塞)I/O区别
NIO与普通的I/O最重要的区别是数据打包和传输方式的不同
I/O:以流的方式处理数据(相比之下NIO速度相当慢)
NIO:以块的方式处理数据
3.NIO核心
NIO以通道Channel和缓冲区Buffer为基础来实现面向块的I/O处理
NIO核心:通道Channel和缓冲区Buffer,每一个I/O操作都要使用通道和缓冲区
4. Channel与Buffer
Channel:对原I/O包中的流的模拟,到任何目的/来自任何源的数据都必须通过一个Channel对象
Buffer:实质上是个容器对象,发送给一个通道的数据都必须先放入缓冲区中,从通道中读取的数据都要先读到缓冲区中
5.通道和流:Channel是Stream的模拟
流:将字节写入流中,再从流中读取数据/将字节写入流中,再从流中写到目的地流是单向的
通道:读/写数据,通道只负责把数据传输到缓冲区,我们不会从通道中直接读取字节/写入字节
通道是双向的,可用于读/写/同时读写
6.Buffer与数组 区别
Buffer-----缓冲区实质上是一个数组.(通常是字节数组ByteBuffer,也可为其他类型的数组,FloatBuffer)
Buffer不仅是数组,Buffer提供了对数据的结构化访问get/put操作,还可跟踪系统的读/写进程
7.NIO 读/写
---读:1.从FileInputStream获得Channel (fin.getChannel())
2.创建一个Buffer, (ByteBuffer buffer = ByteBuffer.allocate(1024))
3.把缓冲区交给通道,数据便会通过通道读取到缓区冲中(channel.read(buffer)),再从缓冲区中读取数据buffer.get
---写:1.从FileOutputStream中获得Channel (fout.getChannel)
2.创建一个Buffer (ByteBuffer buffer = ByteBuffer.allocate(1024))
3.把要写入的数据填充(put)缓冲区,再把缓冲区交给通道,数据便会通过通道写入到目的地(channel.write(buffer))