一部の 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 の使用を避けようとしています。ただし、他に選択肢がない場合もあります。