如何從輸入流中讀取具有偏移量的數據並將一定數量的字節寫入輸出流?從文件的自定義開始寫入到自定義字節數
目標是例如從InputStream
跳過512字節,並將1024字節和512字節偏移量寫入OutputStream
,但如果緩衝區本身被定義爲4096
字節,也會被緩衝。
如何從輸入流中讀取具有偏移量的數據並將一定數量的字節寫入輸出流?從文件的自定義開始寫入到自定義字節數
目標是例如從InputStream
跳過512字節,並將1024字節和512字節偏移量寫入OutputStream
,但如果緩衝區本身被定義爲4096
字節,也會被緩衝。
使用稱爲自適應緩衝區的技術。例如,第一限定陣列字節的數據存儲在的,和所需的緩衝區大小:
private static final int FS_BUFFER = 4096;
private byte[] buff = new byte[FS_BUFFER];
然後使用這個代碼,其中我現在將解釋:
int size = 1024; // the desired length of bytes
raf.seek(512); // the desired input file offset
RandomAccessFile raf = new RandomAccessFile(/* File here */ , "r");
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(/* output stream here */);
int maxBuf = FS_BUFFER > size ? size : FS_BUFFER;
for (int b, written = 0, left; (b = raf.read(buff, 0, maxBuf)) > 0;) {
written += b;
left = size - written;
maxBuf = left < FS_BUFFER ? left : FS_BUFFER;
bufferedOutputStream.write(buff, 0, b);
}
允許向下打破代碼:
int maxBuf = FS_BUFFER > size ? size : FS_BUFFER;
在這裏,我們首先檢查寫入的實際大小是否小於緩衝區本身。如果是,請將要從RandomAccessFile
讀取的最大字節數設置爲文件大小,以便文件從磁盤讀取一次。
如果所需的字節數大於緩衝區,只需使用緩衝區大小作爲要讀取的最大字節數。
for (int b, written = 0, left; (b = raf.read(buff, 0, maxBuf)) > 0;)
在這裏,定義字節的整數,寫入的數據量和剩餘的寫入數據量。然後,從RandomAccessFile
讀取並將字節存儲在緩衝區中,最多可讀取的字節數爲maxBuf
,我們根據文件大小和緩衝區大小來定義這些字節。
written += b;
left = size - written;
這裏我們計算我們要寫入的字節數量以及通過後剩下的字節數。
maxBuf = left < FS_BUFFER ? left : FS_BUFFER;
在這裏,我們現在檢查,如果字節數留下來讀取大於緩衝區小,如果是這樣,我們設置的最大字節數讀入下一個傳球字節的左量讀書。
bufferedOutputStream.write(buff, 0, b);
在這裏我們執行OutputStream
的實際寫入。
那麼,這段代碼會做什麼,是從一個RandomAccessFile讀取到一個*OutputStream
一定數量的字節,並使緩衝區適應剩餘寫入量,文件大小本身它的數據量小於緩衝區或預設緩衝區。這導致兩個數據之間的恆定緩衝數據流,這兩個數據流之間的數據在兩個*Streams
,