作爲每API,這些都是事實:RandomAccessFile.seek()如何工作?
- 的
seek(long bytePosition)
方法簡單地說,將指針移動到 與bytePosition
參數指定的位置。 - 當
bytePosition
大於文件長度時,文件 長度不會改變,除非在(新)結束處寫入一個字節。 - 如果數據以跳過的長度存在,則這些數據不會被觸發,而是保留 。
不過,我很好奇的情況是:當有沒有數據(0字節)的文件,我執行下面的代碼:
file.seek(100000-1);
file.write(0);
所有100,000字節幾乎立即填滿0
。比如說,我可以在10毫秒內超過200GB。
但是,當我嘗試使用其他方法(例如BufferedOutputStream
)寫入100000字節時,同一個過程需要幾乎無限長的時間。
這種時間差異的原因是什麼?有沒有更有效的方法來創建n
字節的文件並填寫0
?
編輯: 如果數據沒有實際寫入,那麼文件如何填充數據? 樣品驗證碼:
RandomAccessFile out=new RandomAccessFile("D:/out","rw");
out.seek(100000-1);
out.write(0);
out.close();
這是輸出:
另外,如果該文件是足夠龐大的我不能再寫入磁盤,由於缺乏空間。
我的猜測是文件大小是「注意到」的,但實際的塊沒有寫入磁盤。沖洗/關閉需要多長時間? (請參閱這裏http://stackoverflow.com/a/257849/540873) –
我的猜測是一樣的,但我打開文件並檢查它。當我沒有寫最後一個字節時,它是空的,結果文件大小爲0字節。當我寫完最後一個字節時,直到最後一個字節的每個字節都填充0,文件大小作爲輸入。包含close()操作的整個過程是問題中指定的時間(這就是爲什麼我很驚訝!) – SirVirgin
當您閱讀該方法的源代碼時,您不明白什麼?在請求別人閱讀它之前,確實已經閱讀了信息來源,你是否爲你工作了嗎? –