2014-07-20 33 views
1

我有一個由數組支持的現有ByeBuffer。現在我想從一個偏移量中獲取這個ByteBuffer的一部分到最後,然後將一些數據(存儲在其他字節數組中)附加到這個分片的ByteBuffer的末尾。假設我在ByteBuffer和字節數組「緩衝區」中有「偏移量」,需要將其添加到ByteBuffer中。這就是我現在正在做的 -有效的方法來分片ByteBuffer並將數據添加到它

   byte[] prevArray = previousByteBuffer.array(); 

       byte[] newArray = new byte[prevArray.length-offset+buffer.length]; 
       for(int i=offset; i<prevArray.length; i++){ 
        newArray[i-offset] = prevArray[i]; 
       } 
       for(int i=prevArray.length; i<(prevArray.length+len); i++){ 
        newArray[i-offset] = buffer[i-prevArray.length]; 
       } 
       ByteBuffer byteBuffer = ByteBuffer.wrap(newArray); 

我認爲我所做的是非常低效。什麼是實現這一目標的有效方式?謝謝。

+0

經典的XY問題。你試圖完成的實際任務是什麼? – EJP

+0

@EJP實際的情況是我正在寫一個函數,它將從文件中讀取一個字節範圍,並且這個範圍被輸入到我的函數中。每次函數被調用時,我都會檢查範圍以查看它是否與我讀取的最後一個數據重疊,如果是,我不想重新讀取重疊的數據。因此,切片並追加。 – Parag

+0

我建議它會更快*不*要做到這一點。讓文件系統進行緩存。它真的很擅長這個。或者如果文件不是很大,可以使用'MappedByteBuffer'。我還將注意力集中在['ByteBuffer.slice()'](http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html#slice())方法。 – EJP

回答

1

你能做的最好的事情是預先分配的最終字節緩衝區一樣大,實用。 arraycopy將會有所幫助,但是什麼是你正在重新複製原始數據。如果您可以使用一些啓發式方法來更好地預測您的最終目標大小,則可以避免重新複製數據,並且可以極大地加速整個事件。

+0

這是一個好主意,但問題是最終的大小可能非常大,最高可達32 MB,同樣的事情並行發生在大約20個數據通道上。所以我認爲該程序可能會遇到內存問題。 – Parag

+0

@Parag 20 * 32 MB = 640 MB,沒什麼大不了的。無論如何,對我來說,這聽起來像你正在閱讀單個文件。如果是這樣,那麼使用內存映射緩衝區並不關心重新讀取重疊數據。 – maaartinus

+0

@maaartinus我預測有人會這麼說,所以讓我這樣說吧,截至目前我已經將這個塊大小配置爲32 MB,但它可以大到256 MB,這是程序的一部分,它本身就是內存密集。所以我想要以某種方式防止重疊數據的複製,並儘快取消分配不必要的數據。正如你指出的那樣,我將看看內存映射緩衝區。謝謝 – Parag

3

您可以使用System.arraycopy。

我們可以使用

int len = prevArray.length-offset+buffer.length; 
ByteBuffer bb = ByteBuffer.allocate(len); 
bb.put(previousByteBuffer); 
bb.put(buffer, offset, buffer.length - offset); 
相關問題