Java NIO Channels 在很多地方都与 streams
相似,不同点有下面几个:
- Channels是双向的,可以读和写,而streams是单向的
- Channels可以进行异步读和写
- Channels总是读或写buffer
再重复一下,我们从 Channel 读数据到 Buffer,或者从 Buffer 写数据到 Channel。
Channel 实现类
下面列举一些重要的 Channel 实现类:
- FileChannel
- DatagramChannel
- SocketChannel
- ServerSocketChannel
FileChannel
: 从文件中读写数据
DatagramChannel
: 通过网络UDP读写数据
SocketChannel
: 通过网络TCP读写数据
ServerSocketChannel
: 类似于Web服务器,通过监听TCP连接,为每个连接创建一个SocketChannel
一些简单的示例
下面是一个使用FileChannel
读写数据的示例:
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) {
System.out.println("Read " + bytesRead);
buf.flip();
while(buf.hasRemaining()) {
System.out.print((char) buf.get());
}
buf.clear();
bytesRead = inChannel.read(buf);
}
aFile.close();