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

  • 相关阅读:
    ASP.NET MVC 3 Performance – on par with MVC 2
    delete obj$
    什么是软件架构设计
    MySQL 5.7版本安装教程-踩坑总结
    Linux操作系统Centos7.2版本搭建Apache+PHP+Mysql环境
    如何给DropDownList控件设置样式(ASP.NET MVC)
    小白如何写需求文档
    List和string之间的互相转换
    五线谱知识
    js字符串与字符数组之间的转换
  • 原文地址:https://www.cnblogs.com/lay2017/p/12905351.html
Copyright © 2011-2022 走看看