通道是由java.nio.channel包定义的。通道表示到I/O源或目标的打开连接。通道实现了Channel接口并扩展了Closeable接口,并且从JDK7开始还扩展了AutoCloseable接口。通过实现AutoCloseable接口,可以使用JDK7新增的带资源的try语句管理通道
Java NIO的通道类似流,但又有些不同:
正如上面所说,从通道读取数据到缓冲区,从缓冲区写入数据到通道。如下图所示:
这些是Java NIO中最重要的通道的实现:
获取通道的一种方式是对支持通道的对象调用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()方法,通过该方法可以将文件映射到缓存。
下面是一个使用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); } } }