Java NIO工做机制简介

前言

本博客只简单介绍NIO的原理实现和基本工做流程html

I/O和NIO的本质区别

NIO将填充和提取缓冲区的I/O操做转移到了操做系统java

I/O 以流的方式处理数据,而 NIO 以缓冲区的方式处理数据;IO是阻塞的,NIO是非阻塞的,直到有数据被读取或者数据彻底写入时,IO线程才开始执行操做,而NIO在如何状况都是非阻塞的数组

通道(Channel)和缓冲区(Buffer)

NIO三个核心对象:通道(Channel)、缓冲区(Buffer)和选择器(Selector)服务器

缓冲区只暂时储存数据,通道用于读取和写入操做,做用至关于IO流,与IO流不一样的是通道是双向的。网络

NIO操做中,从通道读取的数据必须先放在缓冲区中,发送给通道的数据也先放在缓冲区中。spa

NIO通道

通道:通道是一个对象,能够经过它读取和写入数据,能够理解为是对原I/O包中的流的模拟。操作系统

通道和流的区别在于通道是双向。通道能够用于读、写或者同时用于读写,而流只有一个方向,即一个流必须是InputStream的子类或者OutputStream的子类。线程

  • FileChannel:从文件中读写数据。
  • DatagramChannel:能经过UDP读写网络中的数据。
  • SocketChannel:能经过TCP读写网络中的数据。
  • ServerSocketChannel:能够监听新进来的TCP链接,像Web服务器那样。对每个新进来的链接都会建立一个Socke Channel。

NIO缓冲区

缓冲区:缓冲区实质上是一个数组。最经常使用的缓冲区类型是ByteBuffer,对应Java的基本类型都有一种缓冲区区code

缓冲区类型:htm

  • ByteBuffer
  • CharBuffer
  • ShortBuffer
  • IntBuffer
  • LongBuffer
  • FloatBuffer
  • DoubleBuffer

NIO选择器

选择器(Selector):选择器用于监听多个通道的事件。Selector容许单线程处理多个 Channel。也就是说能够注册多个通道,使用同一个选择器,只要开一条线程就能够执行

NIO读写操做

NIO读取过程:先建立一个缓冲区,通道读取数据放在这个缓冲区

graph LR

Channel-->Buffer

NIO写入过程:也是先建立一个缓冲区,里面有储存数据的话,将这些数据发给管道执行写入操做

graph LR
Buffer-->Channel

文件读取操做 读取文件过程:从FileInputStream获取Channel,建立Buffer,将数据从Channel读到Buffer中

//从FileInputStream获取通道
FileInputStream fis = new FileInputStream( "readandshow.txt" );
FileChannel fc = fis.getChannel();
//建立缓冲区
ByteBuffer buffer = ByteBuffer.allocate( 1024 );
//将数据从通道读到缓冲区
fc.read( buffer );

文件写入过程

FileOutputStream fout=new FileOutputStream("write.txt");
FileChannel fc=fout.getChannel();
ByteBuffer buffer=ByteBuffer.allocate(1024);
for (int i=0; i<data.length; i++) {
      buffer.put(data[i]);
}
buffer.flip();
fc.write(buffer);

附录: NIO入门 NIO系列教程

相关文章
相关标签/搜索