一、差别

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 基本认识的更多相关文章

  1. Netty精粹之玩转NIO缓冲区

    摘要: 在JAVA NIO相关的组件中,ByteBuffer是除了Selector.Channel之外的另一个很重要的组件,它是直接和Channel打交道的缓冲区,通常场景或是从ByteBuffer写 ...

  2. Java NIO -- 缓冲区(Buffer)的数据存取

    缓冲区(Buffer): 一个用于特定基本数据类型的容器.由 java.nio 包定义的,所有缓冲区都是 Buffer 抽象类的子类.Java NIO 中的 Buffer 主要用于与 NIO 通道进行 ...

  3. java nio 缓冲区(一)

      本文来自于我的个人博客:java nio 缓冲区(一) 我们以Buffer类開始对java.nio包的浏览历程.这些类是java.nio的构造基础. 这个系列中,我们将尾随<java NIO ...

  4. JAVA NIO缓冲区(Buffer)------ByteBuffer常用方法

    参考:https://blog.csdn.net/xialong_927/article/details/81044759 缓冲区(Buffer)就是在内存中预留指定大小的存储空间用来对输入/输出(I ...

  5. Java NIO 缓冲区学习笔记

    Buffer其实就是是一个容器对象,它包含一些要写入或者刚读出的数据.在NIO中加入Buffer对象,体现了新库与原I/O的一个重要区别.在面向流的I/O中,您将数据直接写入或者将数据直接读到Stre ...

  6. 关于 java,nio,bufferedreader,bytebuffer

    有没有一种方法来读取的ByteBuffer有一个BufferedReader,而无需将其转换为String优先?我想读通过一个相当大的 ByteBuffer作为文本行和我想避免它写入磁盘性能方面的原因 ...

  7. JAVA NIO 之ByteBuffer的mark、position、limit、flip、reset,get方法介绍

    参考博客:http://blog.csdn.net/sunzhenhua0608/article/details/31778519 先来一个demo: import java.nio.ByteBuff ...

  8. Java NIO 缓冲区

    Java NIO 在JDK1.4的时候引入,主要解决传统IO的一些性能问题.NIO 主要内容包含 Buffer .Channel.Selector等内容,本文主要讲解Buffer相关的内容. Buff ...

  9. Java NIO 缓冲区 Buffer

    缓冲区 Buffer 是 Java NIO 中一个核心概念,它是一个线性结构,容量有限,存放原始类型数据(boolean 除外)的容器. 1. Buffer 中可以存放的数据类型 java.nio.B ...

  10. NIO缓冲区基本操作:rewind(),clear(),flip()

    rewind() rewind()方法将position置0,清除mark,它的作用在于为提取Buffer的有效数据做准备. ByteBuffer byteBuf = ByteBuffer.alloc ...

随机推荐

  1. echarts地图上的坐标更换为自定义的图标

    ECharts 是一个开源的数据可视化库,支持多种图表类型,包括地图.在 ECharts 地图中,可以通过自定义的方式来更换坐标点的图标. 下面是一些实现自定义坐标图标的步骤: 首先,你需要准备自定义 ...

  2. USB从机主动断开连接

    目录 在一些情况下,需要USB口的引脚复用成其他功能,比如说PB10.PB11要复用成定时器输出引脚:或者需要USB从机主动断开,类似某些杀毒软件带的"安全弹出",不过杀毒软件操作 ...

  3. 浅谈Java线程池的概念、创建与执行

    转': 浅谈Java线程池的概念.创建与执行 如果使用 newCachedThreadPool   线程池的实例: ExecutorService executor = Executors.newCa ...

  4. 路飞前台全局css 全局配置文件,安装axios,安装vue-cookies,安装elementui,安装bootstrap和jq,后台主页模块表设计,后台主页模块轮播图接口,录入数据,跨域问题详解

    目录 路飞前台全局css 全局配置文件,安装axios,安装vue-cookies,安装elementui,安装bootstrap和jq,后台主页模块表设计,后台主页模块轮播图接口,录入数据,跨域问题 ...

  5. GNSS模块

    1. Location服务注册 第一个注册是在 SystemServer 中将 location 服务注册到 ServiceManager中去:第二个注册是在 SystemServiceRegistr ...

  6. (0403)位运算符+interface

    1)interface 2)位运算符

  7. 使用FTP协议的主机必须设置xftp版本1.2...

    1.查看是不是没安装xftp,xshell上的那个按钮只是启动按钮 2.还是不行的话,试试在linux上安装这个: yum  install lrzsz

  8. pj_0001_compare_col_csv

    #!/usr/bin/python# -*- coding: UTF-8 -*- import pathlibimport pandas as pd print("please input ...

  9. Linux磁盘占满处理

    按一下操作查看大文件在哪里, 清理大文件. 你切换到 / du -sh * 进入占用多的目录,再使用du -sh *找到下一个大目录. 以此类推,删除无用大文件

  10. SAP SD VA01 销售订单中的自动价格更新

    场景 :当用户使用假定物料" A"创建销售订单时,确定了价格,但随后用户意识到需要更改物料,因此他们更改了订单中的物料. 现在,它显示价格已经重新确定,但是在项目条件页面中时,他们 ...