Java NIO Channels 和 流(Streams)非常相似,但还是有一些区别:
- Channels 支持同时读写,流是单向的(只支持读或写);
- Channels 支持异步读写;
- Channels 总是基于缓冲区读写。
阅读文章的过程中如果有任何疑问,欢迎添加笔者为好友,拉您进【七日书摘】微信交流群,一起交流技术,一起打造高质量的职场技术交流圈子,抱团取暖,共同进步。
正如上面提到的,你可以从通道中读取数据写入到缓冲区 (buffer),也可以从缓冲区(buffer)内读数据写入到通道(channel)中。请看如下图例:
Java NIO: Channels read data into Buffers, and Buffers write data into Channels
Channel 实现(Channel Implementations)
以下是 Java NIO 中最重要的 Channel 实现:
- FileChannel
- DatagramChannel
- SocketChannel
- ServerSocketChannel
FileChannel 用于文件的数据读写;
DatagramChannel 用于 UDP 的数据读写;
SocketChannel 用于 TCP 的数据读写;
ServerSocketChannel 允许我们监听 TCP 链接请求,每个请求会创建会一个 SocketChannel.
Channel 的基础示例(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) {
System.out.println("Read " + bytesRead);
buf.flip();
while(buf.hasRemaining()){
System.out.print((char) buf.get());
}
buf.clear();
bytesRead = inChannel.read(buf);
}
aFile.close();
请注意代码中 buf.flip()
的调用,首先把数据读取到缓冲区 Buffer 中,然后调用 flip()
方法;接着再把数据读取出来。后续的章节中还会讲解相关知识。
------完------
推荐阅读:
参考资源:
https://blog.csdn.net/u013565163/article/details/83539738
https://blog.csdn.net/Andrew_Yuan/article/details/80215164