NIO 缓冲区 ByteBuffer

一、差别

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);

 

NIO 缓冲区 ByteBuffer

上一篇:正则匹配中文字符


下一篇:Delphi 在 Github 的开源框架