RandomAccessFile.setLength() メソッドを使用してファイルを書き込もうとしています。私が直面している問題は、一部のファイルサイズでは正常に機能しますが、他のファイルサイズでは機能しません。
勝手な推測: RAM (16GB) と関係があるかどうかはわかりません。私の知る限り、8の倍数である大きなGB値では失敗しているようです。
これが実際に発生している理由を誰かが知っていれば、それが最良の答えです。
この動作を示すおもちゃのプログラムを含めました。同じ結果が表示されている場合はお知らせください。
import java.io.*;
public class Debug {
public static void main( String[] args ) {
// create 5 file sizes: 16 KB, 16 MB, 8GB, 16 GB, 30 GB
long KILO = 1024;
long testNum1 = KILO * 16; // 16 KB
long testNum2 = KILO * KILO * 16; // 16 MB
long testNum3 = KILO * KILO * KILO * 8; // 8 GB
long testNum4 = KILO * KILO * KILO * 16; // 16 GB
long testNum5 = KILO * KILO * KILO * 30; // 30 GB
// print the 5 file sizes
System.out.println("testNum1 is " + testNum1 + " bytes");
System.out.println("testNum2 is " + testNum2 + " bytes");
System.out.println("testNum3 is " + testNum3 + " bytes");
System.out.println("testNum4 is " + testNum4 + " bytes");
System.out.println("testNum5 is " + testNum5 + " bytes");
// attempt to write 5 files to disk, using these sizes
RandomAccessFile f = null;
try {
f = new RandomAccessFile("testNum1", "rw"); // <-- PASS
f.setLength( testNum1 );
f = new RandomAccessFile("testNum2", "rw"); // <-- PASS
f.setLength( testNum2 );
f = new RandomAccessFile("testNum3", "rw"); // <-- FAIL
f.setLength( testNum3 );
f = new RandomAccessFile("testNum4", "rw"); // <-- FAIL
f.setLength( testNum4 );
f = new RandomAccessFile("testNum5", "rw"); // <-- PASS
f.setLength( testNum5 );
} catch( Exception e ) {
System.err.println(e);
} finally {
if( f != null ) {
try {
f.close();
} catch( IOException e ) {
e.printStackTrace();
}
}
}
}
}