我在Windows(64位)和Linux(32位)上都試過下面的代碼。爲什麼FileOutputStream不會拋出OutOfMemoryException
我確信沒有BufferedOutputStream的代碼必然拋出OutOfMemoryException,但它沒有。
這是爲什麼?誰在做{緩存/緩衝/蒸汽}到磁盤?
如果與答案相關,請描述完整流程(Java API - >系統調用)嗎?
此代碼是否使用NIO?
/我困惑。
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class WriteHugeFileToDisk {
private static int BYTE = 1;
private static int KILBYTE = BYTE * 1024;
private static int MEGABYTE = KILBYTE * 1024;
private static int GIGABYTE = MEGABYTE * 1024;
private static long TERABYTE = GIGABYTE * 1024L;
public static void main(String[] args) throws IOException {
FileOutputStream fileOutputStream = new FileOutputStream(args[0]);
DataOutputStream dataOutputStream = new DataOutputStream(fileOutputStream);
byte[] buffer = new byte[MEGABYTE];
for(int i = 0; i < buffer.length; i++) {
buffer[i] = (byte)i;
}
for(long l = 0; l < 4000; l++) {
dataOutputStream.write(buffer);
;
}
}
}
我跑這個代碼與Java 6.使用以下調用:
的Windows:
java WriteHugeFileToDisk %TEMP%\hi.txt
的Linux:
java WriteHugeFileToDisk /mnt/hi.info
請注意:該代碼創建4GB文件只是爲了測試。
好的答案,我只想補充說,緩衝的關鍵是性能。如果您寫入的每個字節都以寫入磁盤的操作結束,那將會很慢。如果你在磁盤上緩衝一個塊的等價物,這將是一個巨大的改進。如果你開始緩衝千兆字節的數據,你不會看到每增加幾兆字節的緩衝區大小都有很大的改進。 – 2010-07-17 21:53:25
@Mattias:是的。當然,如果一個單獨的寫入調用已經*寫入了一個兆字節,那麼緩衝這些任何內容都沒有多大意義。 – 2010-07-17 21:55:01