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


  • 相关阅读:
    一些名词解释
    less那些事儿
    正则表达式检测汉字
    正则匹配括号中内容
    atom中vue高亮支持emmet语法
    正则匹配标签内内容
    联想一体机u盘启动设置
    vuejs时间格式化
    graphicsmagick常用命令
    js中对象的深度复制
  • 原文地址:https://www.cnblogs.com/yszzu/p/9402051.html
Copyright © 2011-2022 走看看