ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

NIO 缓冲区 ByteBuffer

2021-07-12 22:01:07  阅读:160  来源: 互联网

标签:UTF NIO buffer StandardCharsets 内存 ByteBuffer 缓冲区 java


一、差别

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

 

标签:UTF,NIO,buffer,StandardCharsets,内存,ByteBuffer,缓冲区,java
来源: https://www.cnblogs.com/zhousjcn/p/15004172.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有