一、差别
java.nio.HeapByteBuffer
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() 每次读一个字符 System.out.print((char)b); } // 切换成写模式 两个方法 buffer.clear(); /* 此方法会将未读取的字符前移,将position重置到可写入的下标位置。 例如5个字符,读取了2个,还有3个,调用该法则会将剩余3个字符前移,position定位到下标为3的位置 */ //buffer.compact(); } } 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));
2)ByteBuffer转字符串(被转换的ByteBuffer必须处于读模式)
// 方法四 String str = (String) StandardCharsets.UTF_8.decode(buff2);