zoukankan      html  css  js  c++  java
  • 三、Java NIO 通道(Channel)

    所有文章

    https://www.cnblogs.com/lay2017/p/12901123.html

    正文

    Java NIO中的通道(Channel)和我们熟悉的流(Stream)很相似,区别点在于:

    1.Stream只能读或者写,但是Channel可以同时读写

    2.Stream的读写是同步的,而Channel的读写是异步的

    3.Channel总是和缓冲区(Buffer)打交道,从Channel读取数据到Buffer或者从Buffer写入数据到Channel,如图:

    Channel的实现

    以下包含了几个在java Nio软件包中比较重要的Channel实现:

    1.FileChannel:从文件中读取数据的通道

    2.DatagramChannel:通过UDP读取数据

    3.SocketChannel:通过TCP读取数据

    4.ServerSocketChannel:不直接读取数据,而是监听TCP连接的建立。当有TCP链接建立的时候,那么创建一个SocketChannel,从而通过TCP读取数据

    Channel的示例代码

    以下是一个很基础的示例代码,使用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) {
      // 翻转缓冲区,先limit=position,再position=0
      buf.flip();
      // 如果缓冲区还有剩余数据
      while(buf.hasRemaining()){
          // 获取并打印
          System.out.print((char) buf.get());
      }
      // 将position=0,limit=capacity
      buf.clear();
      // 再次读入数据到缓冲区,进入下一个循环
      bytesRead = inChannel.read(buf);
    }
    // 关闭文件对象
    aFile.close();

    代码比较简单,就是通道从文件读取数据,读入buffer再打印。但是这里涉及了一些buffer的操作,比如flip、clear,可能会让读者产生疑惑。后续文章会涉及

  • 相关阅读:
    JAVA的泛型与反射的联合应用
    jsp文件过大,is exceeding 65535 bytes limit
    Eclipse闪退解决方案
    EL中定义函数
    JAVA开发工作流程
    理解HTTP协议
    umask函数
    utime修改文件的存取,修改时间
    Linux C ftruncate 函数清空文件注意事项(要使用 lseek 重置偏移量)
    如何实现多进程写一个文件
  • 原文地址:https://www.cnblogs.com/lay2017/p/12905351.html
Copyright © 2011-2022 走看看