JavaIO(四)-NIO通道详解

什么是通道?

通道是访问 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值