- Java NIO提供了与标准IO不同的IO工作方式
Channels and Buffers(通道和缓冲区):标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。
Asynchronous IO(异步IO):Java NIO可以让你异步的使用IO,例如:当线程从通道读取数据到缓冲区时,线程还是可以进行其他事情。当数据被写入到缓冲区时,线程可以继续处理它。从缓冲区写入通道也类似。
Selectors(选择器):Java NIO引入了选择器的概念,选择器用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个的线程可以监听多个数据通道。
- 区别:
IO是面向流的,NIO是面向缓冲区的
Java IO的各种流逝阻塞的,Java NIO是费阻塞的
- NIO的三个部分
1.channel:通道,数据的读取和写入都可以通过它来完成。
2.selector :选择器,用于选择注册在通道中的已发生的事件。
3.ByteBuffer:一个新的缓冲区,通过这个类我们可以在通道中做写操作和读操作;主要是通过position、limit、和capacity指针的位置来进行操作。
- 为什么要使用JavaNIO
NIO的创建目的是为了让Java程序员可以实现高速I/O而无需编写自定义的本机代码。NIO将最耗时的I/O操作(即填充和提取缓冲区)转移回操作系统,因而可以极大地提高速度。
原来的I/O库(在java.io.*中)与NIO最重要的区别是数据打包和传输的方式。原来的I/O 以流的方式处理数据,而NIO以块的方式处理数据。
面向流的I/O系统一次一个字节地处理数据。一个输入流产生一个字节的数据,一个输出流消费一个字节的数据。为流式数据创建过滤器非常容易。链接几个过滤器,以便每个过滤器只负责单个复杂处理机制的一部分,这样也是相对简单的。不利的一面是,面向流的I/O 通常相当慢。
一个面向块的I/O系统以块的形式处理数据。每一个操作都在一步中产生或者消费一个数据块。按块处理数据比按(流式的)字节处理数据要快得多。但是面向块的I/O缺少一些面向流的I/O所具有的优雅性和简单性。
- 参考地址
http://blog.csdn.net/fcs_learner/article/details/69788773
http://blog.csdn.net/dongnan591172113/article/details/69568900
http://blog.csdn.net/u014104286/article/details/57072704?locationNum=11&fps=1
http://blog.csdn.net/u014082714/article/details/52396424?locationNum=12&fps=1