Java 如何覆盖字节数组中的特定块

Java 如何覆盖字节数组中的特定块,java,arrays,bytearray,audio-recording,overwrite,Java,Arrays,Bytearray,Audio Recording,Overwrite,给定一个bytearray和一个新的bytearray,其中我需要覆盖原始bytearray上的内容,但是从一个特定的位置/偏移开始(a),如下图所示(我们可以说B是新数组的长度)。 如果覆盖的超过了原始数组的实际长度,也要处理新的长度 (这是在不同位置覆盖.WAV文件时需要的) 这是我到目前为止尝试过的,但没有运气 public byte[] ByteArrayAppender(byte[] firstData, byte[] newData, byte[] remainData, in

给定一个bytearray和一个新的bytearray,其中我需要覆盖原始
bytearray
上的内容,但是从一个特定的位置/偏移开始(a),如下图所示(我们可以说B是新数组的长度)。 如果覆盖的超过了原始数组的实际长度,也要处理新的长度

(这是在不同位置覆盖.WAV文件时需要的)

这是我到目前为止尝试过的,但没有运气

 public byte[] ByteArrayAppender(byte[] firstData, byte[] newData, byte[] remainData, int Position) {

    byte[] editedByteArray = new byte[firstData.length + newData.length + remainData.length];


    System.arraycopy(firstData, 0, editedByteArray, 0, Position);

    System.arraycopy(newData, 0, editedByteArray, firstData.length, newData.length);

    System.arraycopy(remainData, 0, editedByteArray, newData.length, remainData.length);

    return editedByteArray;

}

最简单的方法是使用
ByteBuffer
包装原始数组:

final ByteBuffer buf = ByteBuffer.wrap(theOriginalArray);
buf.position(whereYouWant);
buf.put(theNewArray);
注意:上面的代码不检查溢出等。如果可能发生溢出,则代码必须更改为类似以下内容,并且该方法应返回数组:

final int targetLength = theNewArray.length + offset;
final boolean overflow = targetLength > theOriginalArray.length;
final ByteBuffer buf;

if (overflow) {
    buf = ByteBuffer.allocate(targetLength);
    buf.put(theOriginalArray);
    buf.rewind();
} else
    buf = ByteBuffer.wrap(theOriginalArray);

buf.position(offset);
buf.put(theNewArray);

return buf.array(); // IMPORTANT

您可能会发现它很有用。

我已尝试按如下方式覆盖byteArray

public static void main(String[] args) {
    byte[] array1 = new byte[10];
    byte[] array2 = new byte[5];
    for (int i = 0; i < array1.length; i++) {
        array1[i] = (byte) 1;
    }
    for (int i = 0; i < array2.length; i++) {
        array2[i] = (byte) 0;
    }
    Test.overrideArray(3, array1, array2);
}

private static void overrideArray(int start, byte[] originalArray, byte[] overrideArray) {
    //add some codes for check validations lengths of Arrays
    for (int i = start; i - start < overrideArray.length; i++) {
        originalArray[i] = overrideArray[i - start];
    }
    for (int i = 0; i < originalArray.length; i++) {
        System.out.println(originalArray[i]);
    }
}
publicstaticvoidmain(字符串[]args){
字节[]数组1=新字节[10];
字节[]数组2=新字节[5];
for(int i=0;i
和buf.array();是否将给我新的覆盖数组?此代码只是修改原始数组——在本例中,是的,使用
.array()
将返回原始数组,而不是新数组。从你的问题来看,这就是你想要的,不是吗?或者你想创建一个新的数组吗?它工作,我用WAV音频数据,用新记录的旧数据覆盖,当我重写开始和结束时,它工作得很好,但是在中间我遇到麻烦,只有噪音。注意你需要为每一个重写操作创建一个新的<代码> ByteBuffer < /代码>;如果您不想这样做,则需要在每次覆盖之前对其进行
.rewind()
操作。它足够轻量级,您每次都可以创建一个新的。当新数据超过原始数据的长度时,我得到java.nio.BufferOverflowException。我很难想象这个问题的答案会比
System#arraycopy
方法更简单。但也许“fge”是对的。。。