iteye_13980 2011-06-07 15:40
浏览 915
已采纳

用MappedByteBuffer写大文件

在search了很多的有关文章,没有找到用MappedByteBuffer写大文件的具体例子.
大部分都是代码类似于:
[code="java"]
MappedByteBuffer raf = fc.map(MapMode.READ_WRITE, 0, fc.size());
[/code]
或是
MappedByteBuffer raf = fc.map(MapMode.READ_WRITE, 0, someHardCode);

[b]需求是这样的: 文件开始并不存在, 并且文件最后到底是多大我也不清楚.[/b]

我的代码如下:

[code]
public static void test2() throws Exception {
//先将上次文件删除
new File("D:/test2.tmp").delete();
RandomAccessFile raf1 = new RandomAccessFile("D:/test2.tmp","rw");
int mapsize = 1024*100;//100K
FileChannel fc = raf1.getChannel();
MappedByteBuffer raf = fc.map(MapMode.READ_WRITE, 0, mapsize);

    byte[] b1 = new byte[]{'a','b','c','d','e','f','g','h'};
    byte[] utfstr = "this is a test".getBytes("UTF-8");

    long s1 = System.currentTimeMillis();
    for(int i=0;i<10000000;i++){//写一千万次, 

//在循环内部, 会发生 java.nio.BufferOverflowException 异常 !!!!!!
raf.put(b1);
raf.putInt(i);
raf.putInt(i+1);

        raf.put(utfstr);
        raf.put((byte)'\n');
    }
    long d1 = System.currentTimeMillis() - s1;
    fc.close();
    raf1.close();
    System.out.println("spent time1="+(d1/1000));
}

[/code]

望有同学指定一下: 是否 MappedByteBuffer 并不适合这种 不断地 append 的写入方式, 只适合大小已经固定的文件的原来内容的改写?

如果也适合的话, 麻烦请个示例代码! 谢谢!

  • 写回答

5条回答 默认 最新

  • 也许世界还没停 2011-06-08 21:19
    关注

    [code="java"] long cout = 0;

    for (int i = 0; i < 100000; i++) {// 写一千万次,

    // 在循环内部, 会发生 java.nio.BufferOverflowException 异常 !!!!!!

    if (raf.remaining() < 1024) {

    cout += raf.position();

    raf = fc.map(MapMode.READ_WRITE, cout, mapsize);

        }  
        raf.put(b1);  
    
        raf.put(utfstr);  
        raf.put((byte) '\n');  
    }  [/code]
    

    注意map超过文件的长度,会使得文件变大

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog