在Java中:在哪里创建一个指向更大数组的一部分的子数组的方法?

学习Java,请温柔。 理想情况下,我需要创建一个字节数组,指向更大数组的一部分:

byte[] big = new byte[1000]; // C-style code starts load(file,big); byte[100] sub = big + 200; // C-style code ends 

我知道这在Java中是不可能的,并且有两种解决方法可以想到并包括:

  1. 要么通过大的复制部分迭代。

  2. 或者编写自己的类,它将引用big + offset + size并通过使用big作为实际底层数据结构的访问器方法实现“子arrays”。

我试图解决的任务是将文件加载到内存中,然后获取对通过类存储文件的记录的只读访问权限。 速度是最重要的,因此理想情况下我想避免复制或访问方法。 因为我正在学习Java,所以我想坚持下去。

我有其他选择吗? 如果我没有充分解释任务,请提出问题。

在Java中,不可能将数组创建为其他数组的“视图”。 但你可以使用java.nio.ByteBuffer ,它基本上是你在解决方案#2中建议的类。 例如:

 ByteBuffer subBuf = ByteBuffer.wrap(big, 200, 100).slice().asReadOnlyBuffer(); 

不涉及复制(虽然创建了一些对象)。 作为一个标准的库类,我还假设ByteBuffer更有可能接受特殊处理。 JVM的“JIT”优化比自定义优化。

如果要快速读取文件并进行低级访问,请检查java nio的内容。 这是java almanac的一个例子。

您可以使用映射的字节缓冲区在文件内容中导航。

看一下java.lang.String的源代码(它将在src.zip或src.jar中)。 你会看到他们有一系列的cahrs,然后是一个开始和结束。 所以,是的,解决方案是使用类来完成它。

这是在线链接到源 。

感兴趣的变量是:

  • 抵消
  • 计数

substring可能是一个很好的方法,可以看作是一个起点。

如果你想从文件中读取directlry,请使用java.nio.channels.FileChannel类,特别是map()方法 – 这将允许你使用内存映射的I / O,它将非常快并且使用的内存比复制到数组。

读文件到内存很好,很快文件相对较小。 但是当你必须处理巨大的文件时,保持内存不足是一个更理想的目标。

MappedByteBuffer就是你要找的东西。

MappedByteBuffer是一个直接字节缓冲区,其内容是文件的内存映射区域。 映射字节缓冲区的内容可以随时改变,例如,如果该程序或其他程序改变了映射文件的相应区域的内容。 这些变化是否发生以及何时发生,取决于操作系统,因此未指定。