2017-07-17 41 views
0

那么将它复制如何访问一个原始阵列的一部分,我知道有两个类似的问题,但我的是不同的:不需要在Java

如何获得基本数组的子集,而不复制呢?

为什么? 我必须阅读许多大型“文件”(约20M)通过标准输入读取。这些文件内嵌有JPG文件。这些JPG文件用于一些计算。我需要保留原始文件,而我使用嵌入式JPG来决定保留原始文件。

为此我想获得字节数组(原始文件)的子集(JPG)。我想用第三方库(OpenCV)使用这个子集数组。

最接近的解决方案是:Arrays.asList(array).subList(x,y)。 但是这个解决方案不适用于原始数组。我试图通过不复制数组而不使用包装类来提高性能。

真的没有办法抓取原始数组的子集吗? (数组,位置,长度).toArray()返回原始完整字节数组。


编辑:对不起,忘记告诉你,我从设备而不是磁盘获取这些文件。因此,我需要首先将整个事件记录到记忆中。然后决定将它保存在磁盘上或不。

+0

番石榴有'Ints.asList()'(对于其他原始类型相同)。 – shmosel

+1

为什么要将整个文件首先读入内存?只读/跳到JPG部分,阅读,然后做出您的决定。 – EJP

+0

正如我所提到的,我需要决定保留基于JPG的一些属性的整个事情。字节数组来自一个设备。我不想保存在磁盘上以减少磁盘上的IO负担,因为我将处理很多这样的文件。也许是1000年。 – Genom

回答

0

当您在Java中传递数组引用(讲述HotSpot JVM)时,您将引用传递给必须具有特定布局的内存区域:对象头,数组长度,然后是数组内容。你应该以某种方式将标题和长度放在较小的JPG数组的开始位置,从而“破坏”更大的阵列。总而言之,我认为,这可以通过使用sun.misc.Unsafe或JNI,了解您的JVM的详细信息(32位或64位,压缩哎呀或不压缩),运气好,这样就不会在GC中出现,保存并恢复“损坏的”字节,但它非常脆弱并容易出错。

+0

我看了一下JNI,有几个消息来源声称只有通过可用的方法才需要通过JNI访问Java数组。我简要介绍了可用的方法,但我没有找到一种方法来用自定义字段“创建”数组对象。 sun.misc.Unsafe被认为会被Java 9删除,因此非常不鼓励。然而,许多图书馆使用它来获得更好的性能。 sun.misc.Unsafe实际上可以达到所有这些领域。这是一个不安全的分析:https://stackoverflow.com/questions/13780350/is-there-any-way-to-create-a-primitive-array-without-initialization/13785284#13785284 – Genom