【问题标题】:Memory-mapped output stream produces an output file with trailing zeros内存映射输出流产生一个带有尾随零的输出文件
【发布时间】:2013-12-10 13:00:21
【问题描述】:

我正在使用 java.nio 包在 Java 中实现内存映射流。它将一块内存映射到输出文件,当需要将更多元素写入输出文件时,它会映射另一个块,依此类推。

w_buffer = channel.map(FileChannel.MapMode.READ_WRITE, w_cycle*bufferSize, bufferSize);

当要写入文件的元素总量是一次映射到文件的块大小的倍数时,我的实现工作顺利。但是,如果不是这种情况——这种情况不会经常发生,因为流无法决定/知道用户何时停止写入——映射块中的剩余空间也会以尾随零的形式转储到文件中。我应该如何避免输出文件中出现这些尾随零?

提前致谢。

【问题讨论】:

    标签: java file stream memory-mapped-files java.nio.file


    【解决方案1】:

    您可以使用 channel.truncate(size) 将通道截断为给定的大小,但是与 channel.map() 结合使用是否可以移植是值得怀疑的。很多 channel.map 依赖于底层操作系统。在同一个文件上混合“文件访问”和“内存映射访问”通常不是一个好主意。其他解决方案可能是在每个块的开头有一个“使用大小”的值。

    【讨论】:

    • 抱歉迟到了评论。以前的方法看起来不错。我不知道截断这种功能的可用性。但是,它给了我以下错误: 请求的操作无法在用户映射部分打开的文件上执行第二个解决方案听起来很奇怪,因为它需要另一个中间缓冲区而不是内存字节缓冲区(应该在某些之前用文件映射实例化元素可以存储在其中),以便知道应该映射多少元素。
    • 嗯,第二种方法效果很好,而第一种方法 - 调用 truncate 方法 - 可能会导致不同平台上的不同行为,使其对于我的目的不可靠。谢谢!
    猜你喜欢
    • 2016-01-08
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 2022-12-14
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多