Channel
2018-12-04 本文已影响0人
JiinYuu
Java NIO的Channel
和流很像,但又有些不同:
- 你可以用同一个
Channel
来读和写,但流是单向的(读或写); -
Channel
支持异步读写; -
Channel
总是从Buffer
读,以及写入Buffer
,即Channel
只和Buffer
打交道。
如上所述,你从Channel
读入数据到Buffer
,从Buffer
写数据到Channel
。如下图:

Channel Implementations
以下是Java NIO中最重要的几个Channel
实现:
- FileChannel
- DatagramChannel
- SocketChannel
- ServerSocketChannel
FileChannel
从文件读取数据。
DatagramChannel
以UDP协议读写网络数据;
SocketChannel
通过TCP协议读写网络数据;
ServerSocketChannel
允许你像一个web服务器一样监听接入的TCP连接。每个接入连接都会都一个对应的SocketChannel
。
Basic Channel Example
以下是一个使用FileChannel
读取数据到Buffer
的简单例子:
RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw");
FileChannel inChannel = aFile.getChannel();
ByteBuffer buf = ByteBuffer.allocate(48);
int bytesRead = inChannel.read(buf);
while (bytesRead != -1) {
buf.flip();
while (buf.hasRemaining()) {
System.out.print((char) buf.get());
}
buf.clear();
bytesRead = inChannel.read(buf);
}
aFile.close();
注意buf.flip()
这个调用。首先将数据读入Buffer
,然后flip
,然后get
。下篇文章我会详细介绍Buffer
的更多细节。
说明
发现貌似有人在看这个系列文章了,有必要说明下,这个Java NIO系列来源于jenkov.com,本文只是翻译,希望大家千万不要误会,本文不是原创。原文地址:Java NIO。