什么是通道?
通道是访问 I/O 服务的导管。可以在通道上传输“源缓冲区”与“目的缓冲区”要交互的数据,NIO 技术中的数据要放在缓 区中进行管理,再使用通道将缓冲区中的数据传输到目的地,那么Channel就是缓冲区和缓冲区之间的传输管道。
public interface Channel extends Closeable {
public boolean isOpen();
public void close() throws IOException;
}
最顶层的Channel接口只有两个API,对所有通道来说只有两种共同的操作:检查一个通道是否打开(isOpen())和关闭一个打开的通道(close())。
I/O 可以分为广义的两大类别:File I/O 和 Stream I/O。那么相应地也有两种类型的通道,它们是文件(file)通道和套接字(socket)通道。
文件通道:FileChannel
套接字通道:SocketChannel,ServerSocketChannel。还有一个DatagramChannel,这是一个通过 UDP 读写网络中的数据的通道。
通道的创建:
通道可以以多种方式创建。Socket 通道有可以直接创建。如
SocketChannel socketChannel = SocketChannel.open();
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
DatagramChannel datagramChannel = DatagramChannel.open();
但是一个FileChannel 对象却只能通过一个打开的 RandomAccessFile、FileInputStream 或 FileOutputStream对象上调用 getChannel( )方法来获取,并不能直接创建一个 FileChannel 对象。
FileChannel channel = new FileInputStream("E:\\test.txt").getChannel();
RandomAccessFile raf = new RandomAccessFile ("somefile", "r");
FileChannel fc = raf.getChannel( );
通道可以是单向(unidirectional)或者双向的(bidirectional)。对应上边的类图,实现WritableByteChannel 那就是可写通道,实现ReadableByteChannel,就是一个可读通道,单独实现其中一个的都是单向通道,只能在一个方向上进行数据传输,而两个都实现就是双向通道,可以双向传输数据。
ReadableByteChannel只定义了read()方法用于数据读取。
public int read(ByteBuffer dst) throws IOException;
W