• Java NIO Channel通道


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

    Java NIO Channel通道和流非常相似,主要有以下几点区别:

    • 通道可以读也可以写,流一般来说是单向的(只能读或者写)。
    • 通道可以异步读写。
    • 通道总是基于缓冲区Buffer来读写。

    正如上面提到的,我们可以从通道中读取数据,写入到buffer;也可以从buffer内读数据,写入到通道中。下面有个示意图:

    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()方法。接着再把数据读取出来。在后续的章节中我们还会讲解先关知识。

  • 相关阅读:
    Java事务
    Mybatis二级缓存问题
    183.面试题 17.14. 最小K个数(快速排序)
    182. 跟着三叶学最短路径问题(存图方式)
    181. 差分数组学习
    AI大视觉(二十) | 小目标检测的tricks汇总
    CentOS7 上安装 mysql-5.7.26
    如何欺骗 Go Mod?
    .netcore docker常用命令-持续补充
    转载:登录后,用户配置被修改的处理方法
  • 原文地址:https://www.cnblogs.com/shamo89/p/8416558.html
Copyright © 2020-2023  润新知