2013-12-10 67 views
1

我使用java.nio包中的Java執行存儲器映射流。它將一塊內存映射到輸出文件,當需要將更多元素寫入輸出文件時,它會映射另一個塊,等等。內存映射輸出流產生一個輸出文件,尾隨零

w_buffer = channel.map(FileChannel.MapMode.READ_WRITE, w_cycle*bufferSize, bufferSize); 

我的實現平穩地工作時元件的總量被寫入到該文件是在時間映射到文件中的組塊的大小的倍數。但是,如果情況並非如此 - 由於流無法確定/知道用戶何時將停止寫入,這種情況經常不會發生 - 映射塊中的剩餘空間也會以尾隨零的形式轉儲到文件中。我應該如何避免輸出文件中的這些尾隨零?

在此先感謝。

回答

1

可以截斷使用channel.truncate(大小)給定大小的通道,但值得懷疑的是,這將結合工作可移植性與channel.map()。很多channel.map依賴於底層操作系統。在同一個文件中混合「文件訪問」和「內存映射訪問」通常不是一個好主意。其他解決方案可能是在每個塊的開始處有一個「大小使用」值。

+0

抱歉遲到評論。以前的方法看起來沒問題。我還沒有意識到可以使用這種截斷函數。然而,它給了我以下錯誤: 不能在文件上使用用戶映射區域打開 二的解決方案聽起來奇怪,因爲它需要比內存字節的緩衝區中的另一中介緩衝區(應該有一個文件映射被實例化來執行請求的操作之前可以存儲一些元素),以便知道應該映射多少個元素。 – bfaskiplar

+0

那麼,第二種方法完美地工作,而第一個 - 截斷方法的調用 - 可能會導致不同平臺上的不同行爲,使得我的目的不可靠。謝謝! – bfaskiplar