我在一些 Java 代码中使用内存映射文件来快速写入 2G 文件。我将整个文件映射到内存中。我的解决方案遇到的问题是,如果我正在写入的文件神秘地消失了,或者磁盘出现了某种类型的错误,那么这些错误不会冒泡到 Java 代码中。
事实上,从 Java 代码来看,我的编写似乎成功完成了。这是我为模拟此类故障而创建的单元测试:
File twoGigFile = new File("big.bin");
RandomAccessFile raf = new RandomAccessFile(twoGigFile, "rw");
raf.setLength(Integer.MAX_VALUE);
raf.seek(30000); // Totally arbitrary
raf.writeInt(42);
raf.writeInt(42);
MappedByteBuffer buf = raf.getChannel().map(MapMode.READ_WRITE, 0, Integer.MAX_VALUE);
buf.force();
buf.position(1000000); // Totally arbitrary
buf.putInt(0);
assertTrue(twoGigFile.delete());
buf.putInt(0);
raf.close();
此代码运行时完全没有任何错误。这对我来说是一个相当大的问题。我似乎找不到任何关于此类问题的内容。有谁知道如何让内存映射文件正确抛出异常?或者是否有另一种方法可以确保数据实际写入文件?
我试图避免使用 RandomAccessFile,因为它们比内存映射文件慢得多。但是,可能没有任何其他选择。