Java Mapped Byte Buffer - 缓冲区中的垃圾值

时间:2018-03-07 03:43:59

标签: java io mappedbytebuffer

我正在尝试Mapped Byte Buffer(Java),我必须在文件上使用DirectBuffer来执行一些算术运算:

MappedByteBuffer mbf = new RandomAccessFile("blah.bin", "rw").getChannel().map(FileChannel.MapMode.READ_WRITE,0,100*8L);

问题: - 直接缓冲区是否填充为零? 我有一个调试方法,将值转储为

    private void dump(){
    for (int i = 0; i < 100; i++) {
        System.out.println(mbf.getDouble(i));
    }
}

有趣的是,当我在写任何值之前采取转储时,它会倾倒所有零(双打):

当我写信到任何地点时说:

mbf.putDouble(13,100.0);

当我重新运行转储时,它会转储一些随机值:

0.0
0.0
0.0
0.0
0.0
3.16E-322
8.1387E-320
2.0835183E-317
5.333806864E-315
1.36545455721E-312
3.4955636664571E-310
1.8187371284868433E-307
100.0
5.164499756173817E120
0.0
0.0
0.0
0.0
0.0

我的逻辑取决于零值

if (mbf.getDouble(6)==0.0)
//then do some thing
else
//do some thing else

在编写上述任何条件之前,如何确保将值正确初始化为零?有人有类似的问题吗?什么是解决这种情况的最佳方法?

非常感谢任何见解。

更多细节: 操作系统:Windows 10 JDK:java版“1.8.0_111”

提前致谢!

2 个答案:

答案 0 :(得分:1)

double值占用8个字节。 (总是在Java中,通常在其他一些语言中,但并非总是如此。)来自javadoc https://docs.oracle.com/javase/8/docs/api/java/nio/ByteBuffer.html#getDouble-int-

  

读取给定索引处的八个字节,根据当前字节顺序将它们组成一个double值。

当你在字节索引6处要求双重启动时,它实际上使用字节6到13,而字节13包含你存储的(非零)值的第一个字节。

答案 1 :(得分:1)

  

直接缓冲区是否填充为零?

我倾向于认为它是零填充。因为当我使用下面的代码打开blah.bin文件时,磁盘上的大小在Windows和Linux上都是800字节。

  

当我重新运行转储时,它会转储一些随机值:

您看到的是随机值,因为您没有正确移动position的{​​{1}}。也就是说,Integer占用4个字节,所以一旦你完成了在索引0读取它,你应该从位置3开始下一个整数。同样,对于double,它是8个字节。

mapped byte buffer

希望这有帮助。