NIO

Posted 静水楼台/Java部落阁

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NIO相关的知识,希望对你有一定的参考价值。

NIO主要有三大核心部分:
通道:Channel
缓冲区:Buffer
选择器:Selector
通道负责传输,缓冲区负责存储,选择器用于监听多个通道的事件。比如:连接打开,数据到达

传统IO基于字节流和字符流进行操作,而NIO基于管道和缓冲区进行操作。数据总是从通道读取到缓冲区,或者从缓冲区写入到通道中。

IO和NIO的区别:
1.IO是面向流(单向的)的,NIO是面向缓冲区(可读可写)的。
2.IO是阻塞的,NIO是非阻塞的
通道可以异步的读写。


Channel
最重要的实现类:
FileChannel:从文件中读写数据
DatagramChannel:通过UDP读写网络中的数据
SocketChannel:通过TCP读写网络中的数据
ServerSocketChannel:可以web服务器一样监听新进来的TCP连接,每个连接都会创建一个SocketChannel

Channel与Stream的区别在于:
Channel是双向的,而Stream只能是单向的(Stream必须是InputStream或者OutputStream的一个子类,即要么是输入流,要么是输出流,不能即输入又输出)。Channel在被打开之后,即可以读,也可以写,或者同时进行读写操作。 因为Channel是双向的,因此它比Stream更好的反应了底层操作系统IO的实质。特别是在Linux系统中,底层操作系统都是双向的。

=======================================================
任何发送到Channel的数据都必须先放进Buffer

Channel
获取通道的方式:
1.通过流来获取

  • FileInputStream
  • FileOutputStream
  • RandomAccessFile
  • DatagramSocket
  • Socket
  • ServerSocket

例如:
FileInputStream fis = new FileInputStream("D:\\1.txt");
FileChannel channel = fis.getChannel();
2.通过Files类的静态方法newByteChannel()获取字节通道。
或者通过通道的静态方法open()打开并返回指定通道。

 

步骤
读取文件:
1.创建输入流,并从输入流中获取通道(Channel)
2.创建缓冲区
3.将数据读入缓冲区
写入数据到文件:
1.

FileInputStream fis = new FileInputStream("D:\\1.txt");

 

以上是关于NIO的主要内容,如果未能解决你的问题,请参考以下文章

Java NIO:IO与NIO的区别

IO 性能:Selector (NIO) vs AsynchronousChannel(NIO.2)

Java nio NonBlocking NIO

Java NIO:IO与NIO的区别

Java:NIO 和 NIO.2 到底有啥区别?

NIO 源码分析(03) 从 BIO 到 NIO