Channel(通道)的简介

来源:互联网 发布:java set 取值 编辑:程序博客网 时间:2024/05/21 10:25

通道简介:

通道是由java.nio.channel包定义的。通道表示到I/O源或目标的打开连接。通道实现了Channel接口并扩展了Closeable接口,并且从JDK7开始还扩展了AutoCloseable接口。通过实现AutoCloseable接口,可以使用JDK7新增的带资源的try语句管理通道

 Java NIO的通道类似流,但又有些不同:

  • 既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的。
  • 通道可以异步的读写
  • 通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入

正如上面所说,从通道读取数据到缓冲区,从缓冲区写入数据到通道。如下图所示:

Channel的实现:

 这些是Java NIO中最重要的通道的实现:

  • FileChannel  从文件中读写数据
  • DatagramChannel 能通过UDP读写网络中的数据
  • SocketChannel 能通过TCP读写网络中的数据
  • ServerSocketChannel 可以监听新进来的TCP连接。像web服务器那样对新进来的每一个连接都会创建一个SocketChannel

获取通道的一种方式是对支持通道的对象调用getChannel()方法。例如以下I/O类支持getChannel()方法:

   DatagramSocket         FileInputStream      FileOutputStream

   RandomAccessFile       ServerSocket          Socket

根据调用getChannel()方法的对象的类型返回特定类型的通道。例如,当对FileInputStream、FileOutputStream或RandomAccessFile对象调用getChannel()方法时,会返回FileChannel类型的通道。当对Socket对象调用getChannel()方法时,会返回SocketChannel类型的通道。

   获取通道的另外一种形式是使用Files类定义的静态方法,该类是由JDK7新增的。例如使用Files类,可以通过newByteChannel()方法获取字节通道,该方法返回一个SeekableByteChannel对象,SeekableByteChannel是FileChannel实现的一个接口

   所有通道都支持一些额外的方法,通过这些方法可以访问和控制通道。例如FileChannel支持获取或设置当前位置的方法、在文件通道之间传递信息的方法、获取当前通道大小的方法以及锁定通道的方法,等等从JDK7开始,FileChannel还提供了静态的OPen()方法,该方法打开文件并返回执行文件的通道。这提供了获取通道的另外一种

方式。FileChannel还提供了map()方法,通过该方法可以将文件映射到缓存。

基本的Channel示例

 下面是一个使用FileChannel读取数据到Buffer中的示例:

import java.io.*;import java.nio.*;import java.nio.channels.*; class ChannelDEmo {public static void main(String[] args){try(RandomAccessFile aFile=new RandomAccessFile("c:1.txt","rw")){FileChannel inChannel=aFile.getChannel();ByteBuffer buf=ByteBuffer.allocate(48);int br=inChannel.read(buf);while(br!=-1){System.out.println("Read "+br);buf.flip();while(buf.hasRemaining()){System.out.print((char)buf.get());}buf.clear();br=inChannel.read(buf);}}catch(IOException e){System.out.println("IOException :"+e);}}}









0 0