NIO 缓冲区 ByteBuffer 基本认识
一、差别
java.nio.HeapByteBuffer
0. 获取方式:ByteBuffer.allocate(int value);
1. java堆内存,读写效率较低,但分配内存较块。
2. 受到 GC 影响。
java.nio.DirectByteBuffer
1. 直接内存(系统内存),读写效率较高(少一次copy),分配内存较慢。
2. 不受 GC 影响。
3. 使用不当,则容易造成内存泄漏。
二、常用方法
// 获取FileChannel 1.输入输出流 2.RandomAccessFile
try (FileChannel channel = new FileInputStream("Data.txt").getChannel()) {
// 准备缓冲区
ByteBuffer buffer = ByteBuffer.allocate(10);
while (true) {
// 从 channel 读娶数据,写入buffer
int len = channel.read(buffer);
if (len == -1) {
break;
}
//切换buffer为读模式
buffer.flip();
// 打印buffer内容
while (buffer.hasRemaining()) { // buffer.hasRemaining() 检擦是否还有剩余数据
byte b = buffer.get(); // get() 每次读一个字符,会移动读指针 position;相比较,get(i)则不会移动读指针 position;而 get(new byte[n]) 则会读取 n 个字符,并且移动 position
System.out.print((char)b);
}
// 切换成写模式,方法一
buffer.clear();
/*
切换成写模式,方法二:compact();
此方法会将未读取的字符前移,将 position 重置到可写入的下标位置。
例如5个字符,读取了2个,还有3个,调用该法则会将剩余3个字符前移,position定位到下标为3的位置
*/
//buffer.compact();
//buffer.rewind(); // 从头开始读,本质是将 position 设为 0
}
} catch (IOException e) {
e.printStackTrace();
}
三、ByteBuffer与字符串互转
1)字符串转ByteBuffer
// 方法一
ByteBuffer buff1 = ByteBuffer.allocate(16);
buff1.put("hello".getBytes(StandardCharsets.UTF_8)); // 方法二,会将ByteBuffer切换成读模式
ByteBuffer buff2 = StandardCharsets.UTF_8.encode("hello"); // 方法三,会将ByteBuffer切换成读模式
ByteBuffer buff3 = ByteBuffer.wrap("hello".getBytes(StandardCharsets.UTF_8));
// 方法四
ByteBuffer buff4 = Charset.defaultCharset().encode("hello");
2)ByteBuffer转字符串(被转换的ByteBuffer必须处于读模式)
// 方法一
String str = StandardCharsets.UTF_8.decode(buff2).toString();
// 方法二
String str = buff2.toString();
// 方法三
String str = Charset.defaultCharset().decode(buff2).toString();
NIO 缓冲区 ByteBuffer 基本认识的更多相关文章
- Netty精粹之玩转NIO缓冲区
摘要: 在JAVA NIO相关的组件中,ByteBuffer是除了Selector.Channel之外的另一个很重要的组件,它是直接和Channel打交道的缓冲区,通常场景或是从ByteBuffer写 ...
- Java NIO -- 缓冲区(Buffer)的数据存取
缓冲区(Buffer): 一个用于特定基本数据类型的容器.由 java.nio 包定义的,所有缓冲区都是 Buffer 抽象类的子类.Java NIO 中的 Buffer 主要用于与 NIO 通道进行 ...
- java nio 缓冲区(一)
本文来自于我的个人博客:java nio 缓冲区(一) 我们以Buffer类開始对java.nio包的浏览历程.这些类是java.nio的构造基础. 这个系列中,我们将尾随<java NIO ...
- JAVA NIO缓冲区(Buffer)------ByteBuffer常用方法
参考:https://blog.csdn.net/xialong_927/article/details/81044759 缓冲区(Buffer)就是在内存中预留指定大小的存储空间用来对输入/输出(I ...
- Java NIO 缓冲区学习笔记
Buffer其实就是是一个容器对象,它包含一些要写入或者刚读出的数据.在NIO中加入Buffer对象,体现了新库与原I/O的一个重要区别.在面向流的I/O中,您将数据直接写入或者将数据直接读到Stre ...
- 关于 java,nio,bufferedreader,bytebuffer
有没有一种方法来读取的ByteBuffer有一个BufferedReader,而无需将其转换为String优先?我想读通过一个相当大的 ByteBuffer作为文本行和我想避免它写入磁盘性能方面的原因 ...
- JAVA NIO 之ByteBuffer的mark、position、limit、flip、reset,get方法介绍
参考博客:http://blog.csdn.net/sunzhenhua0608/article/details/31778519 先来一个demo: import java.nio.ByteBuff ...
- Java NIO 缓冲区
Java NIO 在JDK1.4的时候引入,主要解决传统IO的一些性能问题.NIO 主要内容包含 Buffer .Channel.Selector等内容,本文主要讲解Buffer相关的内容. Buff ...
- Java NIO 缓冲区 Buffer
缓冲区 Buffer 是 Java NIO 中一个核心概念,它是一个线性结构,容量有限,存放原始类型数据(boolean 除外)的容器. 1. Buffer 中可以存放的数据类型 java.nio.B ...
- NIO缓冲区基本操作:rewind(),clear(),flip()
rewind() rewind()方法将position置0,清除mark,它的作用在于为提取Buffer的有效数据做准备. ByteBuffer byteBuf = ByteBuffer.alloc ...
随机推荐
- 前端记录:树形插件zTree 和 表格扩展 tableX
树形插件zTree 表格扩展 tableX 项目实例 [地区联动实现_前端] <title>区域设置</title> <!--当前位置开始--> <div c ...
- keil调试教程
点击跳转 如果开启调试就提示弹框错误2k,说明你没有破解你的keil,网上自行下载注册机. 调试一定要对应自己板子的晶振,否则当你测试你的延时实际时间时,keil里的sec会不一样,甚至离谱.
- echarts:双y轴图表刻度均匀分布问题
今天分享一个小问题,内容不多. 双y轴图表中,为了图表的美观,经常会隐藏一侧的y轴刻度线,仅显示一侧的刻度线.那么问题就来了,两个y轴的数据数值大小不同,常常会导致刻度线的刻度分布不均匀,该如何解决呢 ...
- WPF 实现雪花效果
雪花控件类: class MM:Control { DispatcherTimer dispatcherTimer = new DispatcherTimer(); public MM() { dis ...
- Linux内核编译中的各类错误示例
1. do_gettimeofday()函数的使用 linux发行版:Ubuntu22.04 linux内核:5.15.0-52-generic 预编译内核:linux-6.0.1 添加在linux- ...
- 5. nginx跨域配置
1.跨域问题处理:在nginx相关接口上配置如下: 如接口有自己的请求头,则加上:如接口自带请求头pubacc-buid if ($request_method = "OPTIONS&quo ...
- 数字图像处理 day1
第一节 什么是图像 f(x y z λ t)z 立体 入 彩色 t 活动 f(x y) 静止的 单色 二值图像 黑白图像 灰度图像 彩色图像 点云图像 多光谱图像 我的理解是 建 ...
- 杂:使用Shell判断文件换行符(LF/CRLF)
前提:文件最后一行有换行符 第一步:以二进制方式取得文件最后两个byte.last2=`tail -c 2 <your_file> | od -x -A n` 第二步:判断最后两个byte ...
- [MySQL高级](一) EXPLAIN用法和结果分析
转载自: https://blog.csdn.net/why15732625998/article/details/80388236
- qt 运行环境配置
注意事项: 1 在设备上进行如下配置 root@am335x-pico:/opt# export QTDIR=/opt/qt-4.6.2-arm root@am335x-pico:/opt# expo ...