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 ...
随机推荐
- Jmeter使用文档(循环怎么用)
Jmeter使用文档(循环怎么用) 基础用法 修改语言 Jmeter之界面语言设置 下面使用简体中文的命名进行说明 打开日志 启动后,右上角有个黄色的感叹号图标,点击即可打开即时日志 如果没有看到重启 ...
- 074_Wrapper_Class
https://developer.salesforce.com/page/Wrapper_Class http://www.sfdcpoint.com/salesforce/wrapper-clas ...
- vue将地区以对象、数组的格式传给后端
项目涉及到了一个地区筛选,同时省市区三级不进行关联,后端要求以对象包数组的格式传参,完整代码 1.先拿到接口返回的地区数据 对数据进行处理,拿到想要的格式 this.provinceOption =r ...
- js复制图片
^(* ̄(oo) ̄)^:可以复制到微信和钉钉,文件夹中不可以复制 <!DOCTYPE html> <html lang="en"> <head> ...
- Java基础-类型转换、变量、变量命名规范
类型转换 强制转换 (类型)变量名 高-->低 自动转换 低-->高 注意点 不能对布尔值进行转换 不能把对象类型转换为不相干的类型 在把高容量转换到低容量的时候,强制转换 转换的时候可能 ...
- hexo博客重新部署
date: 2020-08-04 updated: 2020-12-31 summary: 博客重新部署到国内Gitee(加速访问速度) hexo博客重新部署(从GitHub到Gitee) (博客迁移 ...
- moduleNotFoundError:No module named 'exceptions'
如果pip install docx 过请先卸载,输入如下指令: pip uninstall docx 方法一: pip install python-docx 方法二: 下载: python_doc ...
- REST开发(1)
REST风格 REST简介 Rest(Representational State Transfer),表现形式状态转换(访问网络资源的形式) 传统风格资源描述形式 http://localhost/ ...
- jsp <img src="“> src 相对路径的问题
图片所在路径 jsp所在路径 调用处 相对路径 以调用处JSP位置为参考 每一个../代表上一级 4个 正好找到到webRoot 目录拼接后 webRoot /kernel/_static/img/ ...
- C# null和Any()检查的快捷方式
在C#6中 if (x.Items?.Any() == true) 也可以写自己的扩展方法: public static bool NotNullOrEmpty<T>(this IEnum ...