Java NIO Channels 和 流(Streams)非常相似,但还是有一些区别:

  • Channels 支持同时读写,流是单向的(只支持读或写);
  • Channels 支持异步读写;
  • Channels 总是基于缓冲区读写。


阅读文章的过程中如果有任何疑问,欢迎添加笔者为好友,拉您进【七日书摘】微信交流群,一起交流技术,一起打造高质量的职场技术交流圈子,抱团取暖,共同进步。
七日书摘官方群.jpg

正如上面提到的,你可以从通道中读取数据写入到缓冲区 (buffer),也可以从缓冲区(buffer)内读数据写入到通道(channel)中。请看如下图例:
overview-channels-buffers.png
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() 方法;接着再把数据读取出来。后续的章节中还会讲解相关知识。

英文原文链接:http://tutorials.jenkov.com/java-nio/channels.html

------完------

推荐阅读:

Java NIO 简明教程 之 Java NIO 概述

Java基础知识面试题篇(2020年2月最新版)

更技术学习请进入七日书摘官方群: 七日书摘官方群

七日书摘官方群群聊二维码.png

参考资源:
https://blog.csdn.net/u013565163/article/details/83539738
https://blog.csdn.net/Andrew_Yuan/article/details/80215164