Java NIO学习篇之通道Channel详解

定义:

Channel:通道,运输的介质,可以大致比喻成铁路的铁轨,连接着两个车站,而channel用于打开与IO设备的连接,比如磁盘,套接字等。

通道使用完需要关闭。

与传统IO的Stream比较:

  1. NIO通道可以异步读写,而传统IO的Stream不能。
  2. NIO通道本身不存储数据,只是打开与IO设备之间的连接,所以通道必须要与可以存储数据的缓冲区配合使用。读入时,把IO设备上的数据通过通道读取到缓冲区Buffer上(在缓冲区看来处于写模式,因为是在给缓冲区写入数据)。写出时,读取缓冲区的数据并把数据通过通道写出到IO设备中。
  3. 通道是双向的,通过通道,既可以读取,也可以写入。

在这里插入图片描述

传统IO是用DMA直接存储器进行IO处理的,每当一个IO请求来临,操作系统就会向CPU申请资源,建立一条DMA总线来对该IO请求进行处理,然后CPU就不负责该IO操作了,但是每次一个IO请求到来时,都得向cpu申请资源。并且如果应用程序发起来太多的IO操作后,建立过多的DMA总线后,会造成总线冲突。

在这里插入图片描述
通道是一个完全独立的处理器,专门用于IO操作,拥有一套自己的命令,但是也附属于cpu。当IO请求来临时,无需向cpu申请资源。可以节省更多的CPU资源去处理其他请求。

在这里插入图片描述

Channel的实现:

java.nio.channels.Channel是一个接口,他有一些常用的实现类:

  • FileChannel: 从文件读写数据的channel。
  • DatagramChannel: 通过UDP协议读写网络中的信号。
  • SocketChannel:通过TCP协议读写网络中的Channel。
  • ServerSocketChannel:监听一个TCP连接,对于每一个新的客户端连接都创建一个SocketChannel。

获取通道的方式:

1.java针对支持通道的类提供了getChannel方法来获取通道:
a) 本地IO:获取的是FileChannel

  • fileInputStream.getChannel();
  • fileOutputStream.getChannel();
  • randomAccessFile.getChannel();

b)网络IO:

  • socket.getChannel(); //获取的是SocketChannel
  • serverSocket.getChannel(); //获取的是ServerSocketChannel
  • datagramSocket.getChannel(); //获取的是DatagramChannel

2.JDK1.7以后各通道提供了静态方法open方法。
3.JDK1.7以后Files工具类提供newByteChannel方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章