JAVA NIO Channel

Basic:
 
多数通道都是连接到开发的文件描述符的。Channel类提供维持平台独立性的抽象过程。
 
通道是一种途径,访问和操做操做系统,缓冲区是数据操做点:
Channel类继承结构图:
经过API主要由接口指定(面向接口),通道实现常常要操做本地操做系统的代码,因此不一样操做系统的实现会有根本的差别性,通道接口容许以可控且可抑制的方式来访问底层IO.
 
IO广义两大类:File IO、Stream IO 《==》通道两大类:FileChannel(文件通道)、SocketChannel-ServerSocketChannel-DatagramChannel(套接字通道)。
 
通道的单向和双向:实现ReadableByteChannel read()方法《==》实现WritableByteChannel write()方法。
ByteChannle只是一个提供继承便捷的借口。简化类定义的语法糖。全部通道基本都是双向的。
 
通道会链接一个特定的IO服务,且通道实例性能受所链接的IO服务的特征限制。
 
ByteChannel 的read()和write()方法是用ByteBuffer做为参数,返回已传输的字节数,比缓冲区的字节数少或者可能为0,由于一次输出不完,缓冲去的位置会与已传输字节相同数量的前移,若是只进行了部分传输,缓冲区能够被从新提交给通道,并从上次中断的地方继续传输(基于Buffer的positon属性,继续操做postion到limit的数据)。该过程重复进行,直到Buffer.hasRemaining()方法返回false:以下:
 
 1 /**
 2      * 基于基本channel buffer的文件复制操做
 3      */
 4     public static void fileTransferByNormal() {
 5         try {
 6             RandomAccessFile afile = new RandomAccessFile("hello.txt", "rw");
 7             RandomAccessFile bfile = new RandomAccessFile("hehe.txt", "rw");
 8             FileChannel ac = afile.getChannel();
 9             FileChannel bc = bfile.getChannel();
10 
11             ByteBuffer bf = ByteBuffer.allocateDirect(16 * 1024);
12             while (ac.read(bf) != -1) {
13                 bf.flip();
14                 while (bf.hasRemaining()) {
15                     bc.write(bf);
16                 }
17                 bf.clear();
18             }
19         } catch (FileNotFoundException e) {
20             e.printStackTrace();
21         } catch (IOException e) {
22             e.printStackTrace();
23         }
24     }

 

Blocking Nonblocking:非阻塞模式不会让调用的线程休眠,要么请求当即完成,或者返回误操做。Stream-oriented能够设置nonblocking。
 
Socket Channel 继承自SelectableChannel=》Selectors=》多路复用。(非阻塞IO)。
 
通道关闭:
通道不能被重复利用,打开的通道表明与一个特定IO服务的特定连接并封装该连接的状态,通道关闭则连接丢失。
 
通道上的屡次close(),无影响。
 
若是一个线程在一个通道上被阻塞同时被中断,则该通道将被关闭,线程抛出ClosedByInterruptException异常。
 
一个线程的interrupt status被设置,且该线程视图访问一个通道,那么这个通道会被关闭,并抛出ClosedByInterruptException异常。
 
通道上休眠线程的中断区别于selectors上的休眠线程的中断。
 
实现InterruptableChannel的Channel能够在任什么时候候被关闭,同时通道上的休眠线程会被唤醒并接收到一个AsynchronousInterruptedException。异步关闭。
相关文章
相关标签/搜索