2014-07-20 92 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); 
相关问题