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学习笔记

    Java NIO学习笔记 一 基本概念 IO 是主存和外部设备 ( 硬盘.终端和网络等 ) 拷贝数据的过程. IO 是操作系统的底层功能实现,底层通过 I/O 指令进行完成. 所有语言运行时系统提供执 ...

  2. 零拷贝详解 Java NIO学习笔记四(零拷贝详解)

    转 https://blog.csdn.net/u013096088/article/details/79122671 Java NIO学习笔记四(零拷贝详解) 2018年01月21日 20:20:5 ...

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

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

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

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

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

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

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

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

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

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

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

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

  9. Java NIO 学习笔记(六)----异步文件通道 AsynchronousFileChannel

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

随机推荐

  1. mongodb模式模型设计及编码-Mongoose

    走到这一步,我们的网站还不能称为动态的网站,因为所要的数据都是伪造的,所以现在要对数据库的模型进行设计   Mongoose 我们用到的工具模块是Mongoose,他能对Mongodb进行建模的这样一 ...

  2. Ubuntu系统---C++之Eclipse IDE 编译器安装

    Ubuntu系统---C++之Eclipse IDE 编译器安装 Eclipse是一个基于Java的.开放源码的.可扩展的应用开发平台,它为编程人员提供了一流的Java集成开发环境(Integrate ...

  3. 关于python logging模块读文档的几个心得

    1. logger是分层级的,root是所有logger的祖先. 2. root这个logger在执行logging.warning() 等一系列方法和basicConfig()的时候才会被初始化ha ...

  4. go语言合并两个数组

    https://stackoverflow.com/questions/16248241/concatenate-two-slices-in-go Add dots after the second ...

  5. script标签中的async、defer属性

    Script标签是我们常用的引用js脚本的一种方式. 撸代码的时候,我们常常只写src属性,直接忽略其他属性. 最近发现了2个可以利用的属性:async.defer. 顾名思义async就是异步,在不 ...

  6. [Visual Studio] 问题:VS下运行项目时,检测到在集成的托管管道模式下不适用的 ASP.NET 设置。

    vs2012调试时默认会是集成模式,vs2012调试时怎么使用传统模式哪? 这个时候只要选中启动项目按F4,在托管管道模式里选传统模式即可!

  7. C# 之 .net core -- MVC模式的显示、增、删、改

    上一篇介绍数据的创建连接,接下来就是基本的增删改 一.右键添加.控制器 二.选择这个带试图的 三.其他的不要动,点击添加 四.执行一下,改下url 试一下他的增删改. 其实自己写的话可以用form表单 ...

  8. ubunu安装qq、微信等、

    参考: https://www.lulinux.com/archives/1319 安装下面下载deepin-wine-for-ubuntu,然后进去安装 https://github.com/wsz ...

  9. SSH自动断开处理

    解决ssh登录后闲置时间过长而断开连接 时我们通过终端连接服务器时,当鼠标和键盘长时间不操作,服务器就会自动断开连接,我们还的需要重新连接,感觉很麻烦,总结一下解决此问题的方法 方法一. 修改/etc ...

  10. VSCode:配置自动修复eslint

    { //"tfvc.location": "C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Profess ...