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,可能会让读者产生疑惑。后续文章会涉及

  • 相关阅读:
    linux下C++程序开发范例
    a list of compiler books — 汗牛充栋的编译器参考资料
    中国象棋将帅问题
    CPU利用率问题:操作系统原理和API
    算法性能分析
    MySQL时间分组查询
    在MongoDB的MapReduce上踩过的坑
    C++双缓冲多线程分析大文件词频
    MongoDB进行MapReduce的数据类型
    得到内网域管理员的5种常见方法<转>
  • 原文地址:https://www.cnblogs.com/lay2017/p/12905351.html
Copyright © 2011-2022 走看看