Java NIO的Channel和流很像,但又有些不同:
- 你可以用同一个
Channel来读和写,但流是单向的(读或写); -
Channel支持异步读写; -
Channel总是从Buffer读,以及写入Buffer,即Channel只和Buffer打交道。
如上所述,你从Channel读入数据到Buffer,从Buffer写数据到Channel。如下图:
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。







网友评论