博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NIO使用小结
阅读量:6376 次
发布时间:2019-06-23

本文共 1302 字,大约阅读时间需要 4 分钟。

  所谓的NIO,是new io的缩写,它提供了buffer的功能来提交io的性能。jdk从1.4之后开始提供相关操作。

  基本结构:Buffer抽象类的一系列子类实现,其中BooleanBuffer不存在,也没必要缓冲。具体如下:

Buffer有四个基本属性:
1、capacity  容量,buffer能够容纳的最大元素数目,在Buffer创建时设定并不能更改
2、limit buffer中有效位置数目
3、position 下一个读或者写的位置
4、mark  用于记忆的标志位,配合reset()使用,初始值未设定,调用mark后将当前position设为值
四者关系:0 <= mark <= position <= limit <= capacity

 同时针对各中数据结构,提供了通道(channel)的概念,可以针对该数据结构进行双向操作。

  例1:ByteBuffer使用

 
  1. ByteBuffer byteBuffer = ByteBuffer.allocate(1024); 
  2.       byteBuffer.put("hello wolrd".getBytes()); 
  3.       System.out.println(byteBuffer.position()); 
  4.       System.out.println(byteBuffer.capacity()); 
  5.       System.out.println(byteBuffer.limit()); 

  例2:文件内容拷贝

 
  1. String infile = "C:\\from.txt";   
  2.      String outfile = "C:\\to.txt";   
  3.      // 获取源文件和目标文件的输入输出流   
  4.      FileInputStream fin = new FileInputStream(infile);   
  5.      FileOutputStream fout = new FileOutputStream(outfile);   
  6.      // 获取输入输出通道   
  7.      FileChannel fcin = fin.getChannel();   
  8.      FileChannel fcout = fout.getChannel();   
  9.      // 创建缓冲区   
  10.      ByteBuffer buffer = ByteBuffer.allocate(1024);   
  11.      while (true) {   
  12.          // clear方法重设缓冲区,使它可以接受读入的数据   
  13.          buffer.clear();   
  14.          // 从输入通道中将数据读到缓冲区   
  15.          int r = fcin.read(buffer);   
  16.          // read方法返回读取的字节数,可能为零,如果该通道已到达流的末尾,则返回-1   
  17.          if (r == -1) {   
  18.              break;   
  19.          }   
  20.          // flip方法让缓冲区可以将新读入的数据写入另一个通道   
  21.          buffer.flip();   
  22.          // 从输出通道中将数据写入缓冲区   
  23.          fcout.write(buffer);   
  24.      }   

 更多例子,参考:

 

 本文转自 zhouhaipeng 51CTO博客,原文链接:http://blog.51cto.com/tianya23/707292,如需转载请自行联系原作者

你可能感兴趣的文章
CentOS 6.8 虚拟机安装详解
查看>>
B树、B-树、B+树、B*树
查看>>
4.比较排序之归并排序(递归)
查看>>
vagrant 介绍,安装与使用
查看>>
三十而立,当以何立足于世?
查看>>
iOS开发之二维码扫描
查看>>
DBCC DBREINDEX重建索引提高SQL Server性能
查看>>
.NET平台下Redis使用(二)【StackExchange.Redis学习】
查看>>
javascript中全局变量的定义
查看>>
带你走进SAP项目实施过程——前言(0)
查看>>
How do I measure JVM startup time?
查看>>
SQL Server如何定位自定义标量函数被那个SQL调用次数最多浅析
查看>>
Cocos Creator 获取节点的方式
查看>>
React Native(五)——获取设备信息react-native-device-info
查看>>
Ubuntu 16.04 -- 同时配置Nginx(转发)和frp(内网映射)和HTTPS(ca加密) - 端口转发
查看>>
dig linux下的使用
查看>>
通过socket实现处理多个连接,send和resv都是有数量限制的
查看>>
proposal_layer.py层解读
查看>>
SpringMVC自定义视图Excel视图和PDF视图
查看>>
selenium截取具体元素图片(python版)
查看>>