1.缓冲区分配 方法   以 ByteBuffer 为例

(1)使用静态方法

ByteBuffer buffer = ByteBuffer.allocate( 500 );

  allocate() 方法分配一个具有指定大小的底层数组,并将它包装到一个缓冲区对象中

(2)使用wrap方法将数组转成缓冲区

byte bts[] = new byte[1024];
ByteBuffer buffer = ByteBuffer.wrap( bts );

  使用了 wrap() 方法将一个数组包装为缓冲区。一旦完成包装,底层数据就可以通过缓冲区或者直接访问。

2.缓冲区分片

  slice()发放可以根据现有的缓冲区创建一种子缓冲区,新缓冲区与原缓冲区的一部分数据共享

  代码举例:

//创建一个缓冲区并给缓冲区添加数据
ByteBuffer btBuffer = ByteBuffer.allocate(15);
for (int i = 0; i < btBuffer.capacity(); i++) {
btBuffer.put((byte)i);
}
//指定子缓冲区的位置和限制 使用slice()方法 将缓冲区分区
btBuffer.position(5);
btBuffer.limit(11);
ByteBuffer subBuffer = btBuffer.slice(); //修改子缓冲区的数据
for (int i = 0; i < subBuffer.capacity(); i++) {
byte bt = subBuffer.get(i);
bt = (byte) (bt*10);
subBuffer.put(i, bt);
}
//将缓冲区的posion和limit设置成原来的大小
btBuffer.position(0);
btBuffer.limit(btBuffer.capacity());
//查看缓冲区数据
while (btBuffer.remaining()>0) {
System.out.println(btBuffer.get());
}
}

输出结果

 

3.只读缓冲区

  调用asReadOnlyBuffer()的方法将任何一个常规缓冲区转换为只读缓冲区(单向的),此方法返回的缓冲区与原来的缓冲区数据共享且完全相同,但是这个缓冲区是只读的。

  制度缓冲区对于数据保护很有用,例如将缓冲区传递给某个对象的方法时,您无法知道这个方法是否会修改缓冲区中的数据。创建一个只读的缓冲区可以 保证 该缓冲区不会被修改。

  代码展示:

//创建一个缓冲区并给缓冲区添加数据
ByteBuffer btBuffer = ByteBuffer.allocate(15); ByteBuffer copBuffer = btBuffer.asReadOnlyBuffer(); copBuffer.put(2, (byte) 10);

  运行上述代码会报错,证明了只读的缓冲区不能被修改

4.直接缓冲区和间接缓冲区

  另一种有用的 ByteBuffer 是直接缓冲区。 直接缓冲区 是为加快 I/O 速度,而以一种特殊的方式分配其内存的缓冲区。

  实际上,直接缓冲区的准确定义是与实现相关的。Sun 的文档是这样描述直接缓冲区的:

    给定一个直接字节缓冲区,Java 虚拟机将尽最大努力直接对它执行本机 I/O 操作。也就是说,它会在每一次调用底层操作系统的本机 I/O 操作之前(或之后),尝试避免将缓冲区的内容拷贝到一个中间缓冲区中(或者从一个中间缓冲区中拷贝数据)。

  代码展示:

FileInputStream fis = new FileInputStream( infile );
FileOutputStream fos = new FileOutputStream( outfile ); FileChannel fcin = fis.getChannel();
FileChannel fcout = fos.getChannel();
ByteBuffer buffer = ByteBuffer.allocateDirect( 800 );
while (true) {
buffer.clear();
int r = fcin.read( buffer );
if (r==-1) {
break;
}
buffer.flip();
fcout.write( buffer );
}

Java NIO 学习笔记五 缓冲区补充的更多相关文章

  1. Java NIO学习笔记五 FileChannel(文件通道)

    Java NIO FileChannel Java NIO FileChannel是连接文件的通道.使用FileChannel,您可以从文件中读取数据和将数据写入文件.Java NIO FileCha ...

  2. Java NIO 学习笔记 读写结合补充

    小练习:nio读写文件,将fileread中的内容读取到filewrite中 try { //创建输入通道 FileInputStream fis = new FileInputStream(&quo ...

  3. Java NIO 学习笔记(五)----路径、文件和管道 Path/Files/Pipe

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  4. Java IO学习笔记五:BIO到NIO

    作者:Grey 原文地址: Java IO学习笔记五:BIO到NIO 准备环境 准备一个CentOS7的Linux实例: 实例的IP: 192.168.205.138 我们这次实验的目的就是直观感受一 ...

  5. Java NIO 学习笔记(七)----NIO/IO 的对比和总结

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  6. Java NIO 学习笔记(四)----文件通道和网络通道

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  7. Java NIO 学习笔记(三)----Selector

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  8. Java NIO 学习笔记(二)----聚集和分散,通道到通道

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  9. Java NIO 学习笔记(一)----概述,Channel/Buffer

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

随机推荐

  1. ajax分页实现(php)

    ajax分页实现(php) 使用jquery.pagination.js插件 引入js文件.css文件 <link rel="stylesheet" href="/ ...

  2. coding.net及git的使用方式

    一般部分测试的公司里可能会用到代码管理工具,这里可能不得不推荐coding.net和git这个工具,类似于svn,不过用命令行的情况多点 这里简单介绍下 1.建立coding.net 首先新建一个co ...

  3. 使用HTMLParser爬取标签内容

    以此网站为例 import urllib.request from html.parser import HTMLParser from html.entities import name2codep ...

  4. Hadoop的安装(日志四)

    上一篇:SSH免密码(日志三) 1,进入conf目录,查看所有的文件 2,第一个修改的是hadoop-env.sh的文件,配置javahome的地址 3,第二个就是配置core-site的文件,包括临 ...

  5. poj1151 Atlanis 线段树+离散化求矩形面积的并

    题目链接:http://poj.org/problem?id=1151 很经典的题目,网上有很多模板代码,自己理解了一天,然后很容易就敲出来了... 代码: #include<iostream& ...

  6. maven 聚合工程的创建和打包

    ---恢复内容开始--- 使用eclipse创建maven项目 第一步:创建父工程hg-parent,如图; 右击空白处,new创建新maven工程: 搜索maven项目 父工程使用pom打包方式 第 ...

  7. ZED 相机 && ORB-SLAM2安装环境配置与ROS下的调试

    注:1. 对某些地方进行了更新(红色标注),以方便进行配置. 2. ZED ROS Wrapper官方github已经更新,根据描述新的Wrapper可能已经不适用与Ros Indigo了,如果大家想 ...

  8. HotSpot的算法实现

    1.枚举根节点 可达性分析中从GC Roots节点找引用,可作为GC Roots的节点主要是全局性的引用与执行上下文中,如果要逐个检查引用,必然消耗时间.另外可达性分析对执行时间的敏感还体现在GC停顿 ...

  9. libsvm参数选择

    以前接触过libsvm,现在算在实际的应用中学习 LIBSVM 使用的一般步骤是: 1)按照LIBSVM软件包所要求的格式准备数据集: 2)对数据进行简单的缩放操作: 3)首要考虑选用RBF 核函数: ...

  10. mysql一库多表查询主键

    mysql> show databases; mysql> use information_schema; mysql> show tables; mysql> select ...