我正在实施预写日志记录作为应用程序数据恢复的一部分(应用程序在JAVA中)。延迟是一个问题,因此我需要进行缓冲写入而不是同步写入。
看看BufferedOutputStream实现,我意识到缓冲仍然发生在应用程序级别,所以如果应用程序崩溃,我可能会丢失未刷新的日志记录数据(这是正确的假设吗?还是JVM以某种方式处理这个?)< / p>
理想情况下,我想要一个将缓冲区推迟到操作系统的Java库,以防止应用程序崩溃。
Java.nio.FileChannel Mem-Mapped文件将满足我的目的。但我有点犹豫。因为我还需要在恢复期间迭代日志文件,所以我将不得不维持一个额外的EOF状态 - 我写入数据的最后一个偏移量。这是因为mem-mapped缓冲区大小将是固定大小的页面长度,因此文件长度与读取的有效EOF不同。
我有什么选择?