java首选的不复制字节数据的方式是什么

java首选的不复制字节数据的方式是什么,java,arrays,object,stream,byte,Java,Arrays,Object,Stream,Byte,在我的例子中,有一个类在单个数组中保存大量字节数据 byte myData[];//myData.length = very large number 我要做的是通过这个类为其他类/用户提供数据。但是,每个请求都部分包含在myData数组中。对于请求,它有起始索引和结束索引。当用户需要此请求时,我需要返回以下内容: System.arrayCopy(myArray,startIndex , requestBuffer , endIndex , requestBuffer.length); re

在我的例子中,有一个类在单个数组中保存大量字节数据

byte myData[];//myData.length = very large number
我要做的是通过这个类为其他类/用户提供数据。但是,每个请求都部分包含在myData数组中。对于请求,它有起始索引和结束索引。当用户需要此请求时,我需要返回以下内容:

System.arrayCopy(myArray,startIndex , requestBuffer , endIndex , requestBuffer.length);
return requestBuffer;

我想问的是;是否可以在不复制数据的情况下执行此操作,因为当请求太多时,它可能会导致内存不足等问题。

您可以创建一个不可变对象,该对象将保存对字节数组的引用和两个整数-开始和结束索引

然后,您将传递所述对象而不是数组。

查看类

为了进一步扩展,您可以创建一个封装对象,该对象为来自主阵列的数据提供服务,而不提供任何更改底层数据的机会

这方面的一个例子如下:

public class EncapsulatedData {
    private final byte[] data; //<-- only holds a reference to the byte array, no data is copied
    private final int start;
    private final int range;
    
    public EncapsulatedData(byte[] data, int start, int end){
        this.data=data;
        this.start=start;
        this.range=end-start;
        
        if (end>=data.length || start<0){
            throw new IndexOutOfBoundsException();
        }
    }
    
    public byte get(int index){
        if (index>range){
            throw new IndexOutOfBoundsException();
        }
        return data[index+start];
    }
    
    public static void main(String[] args){
        byte[] bigData=new byte[]{0,1,2,3,4,5,6,7,8,9,10};
        
        EncapsulatedData dataProvider=new EncapsulatedData(bigData,4,9);
        
        System.out.println(dataProvider.get(0)); //prints 4
        System.out.println(dataProvider.get(2)); //prints 6
        System.out.println(dataProvider.get(4)); //prints 8
        System.out.println(dataProvider.get(5)); //prints 9
    }
    
    
}

这个新的封装仍然直接与
字节[]
通信,但其行为就好像它是一个子封装一样

在数组周围做一个包装,让客户端只看到它的一部分。如果您将类设置为final,您将享受解决方案几乎本机的速度。包装现有数组的功能在Java 7中显示。@SimonC-您是对的,它至少在Java 6中存在。我将编辑答案。
EncapsulatedData(EncapsulatedData encapsulateData, int start, int end){
    this.data=encapsulateData.data;
    this.start=encapsulateData.start+start;
    this.range=end-start;
    
    if (end>encapsulateData.range || start<0){
        throw new IndexOutOfBoundsException();
    }
}
....
....
....
public static void main(String[] args){
    byte[] bigData=new byte[]{0,1,2,3,4,5,6,7,8,9,10};
    
    EncapsulatedData dataProvider=new EncapsulatedData(bigData,4,9);
    
    EncapsulatedData dataProvider2=new EncapsulatedData(dataProvider,1,3);
    
    System.out.println(dataProvider2.get(0)); //prints 5

}