zoukankan      html  css  js  c++  java
  • FileChannel与ByteBuffer的使用示例

     DirectByteBuffer直接内存的使用场景和作用

    生命周期长的大对象,

    减少java堆GC, 减少内存copy

    http://www.importnew.com/26334.html

    
    
     1 public class DirectByteBufferTest {
     2 
     3 
     4     @Test
     5     public void test_copyFile() throws IOException {
     6         ByteBuffer byteBuffer = ByteBuffer.allocateDirect(10);//100kbytes
     7         FileChannel readChannel = FileChannel.open(new File("D:/in.txt").toPath());
     8         //out.txt必须已经存在, writeChannel必须以WRITE方式打开
     9         FileChannel writeChannel = FileChannel.open(new File("D:/out.txt").toPath(), StandardOpenOption.WRITE);
    10         int read;
    11         while ((read = readChannel.read(byteBuffer)) != -1) {
    12             //buffer从读切换到写
    13             byteBuffer.flip();
    14             // 打印信息必须放在flip后面, 否则decode出来的是上次read的结果.根据in.txt的字符编码修改下面的ISO_8859_1
    15             //System.out.println(read + "--" + StandardCharsets.ISO_8859_1.decode(byteBuffer));
    16             writeChannel.write(byteBuffer);
    17             // 写完之后清空缓冲区,否则read=0一直死循环
    18             byteBuffer.clear();
    19         }
    20         writeChannel.close();
    21         readChannel.close();
    22     }
    23 }

     测试其他总结:

    ByteBuffer.allocateDirect缓冲区大小根据输入文件的大小调整,但是太大时输出性能也提高不了多少, 对于大文件,1M的缓存区应该差不多了。
    对于超大文件, 应该换成其他读取方式

    benchmark: https://developer.ibm.com/articles/j-zerocopy


  • 相关阅读:
    python后端面试题
    Django模块
    centos 6.x下jira显示饼图乱码解决方法
    Confluence与Jira安装及后期迁移问题记录
    SaltStack安装部署
    jumpserver跳板机(堡垒机)安装
    Python之Web前端Ajax
    python3.6下pycharm连接mysql
    Mac下安装SecureCRT客户端并激活
    Python模块之paramiko
  • 原文地址:https://www.cnblogs.com/yszzu/p/9402051.html
Copyright © 2011-2022 走看看