将多个 byte[] 数组组合成一个文件

Combining multiple byte[] arrays into a single file

我正在写一个文件传输协议,其中的文件是 在服务器和客户端之间以每个 512 字节的数据包发送。 如果文件大于该大小,文件将被拆分成多个数据包。 我认为我正在做拆分,但我在重新组装文件时遇到了问题。 如果文件小于 512 字节(一个数据包),则汇编过程有效,但如果文件较大,则只有最后到达的数据包被写入文件。

这是 FileAssembler 的代码:

public class FileAssambler {

List<byte[]> bytesList;
private String name;
boolean finished=false;
private FileOutputStream fileOutputStream;

public FileAssambler(String name){
    bytesList = new ArrayList<byte[]>();
    this.name = name;
}

public void addBytes(byte[] bytes){
    if(bytes.length<512)
        finished=true;
    bytesList.add(bytes);
}

public boolean isFinished(){
    return finished;
}

public void createFile() throws IOException{
    Iterator<byte[]> it = bytesList.iterator();
    while(it.hasNext())
        writeBytesToFile(it.next());
}

private void writeBytesToFile(byte[] bytes){

    try{
        fileOutputStream = new FileOutputStream(name);
        fileOutputStream.write(bytes);
    }catch(IOException e){
        e.printStackTrace();
    }
}

}

我认为 fileOutputStream.write(bytes) 只是将现有字节替换为新字节,有什么方法可以替代写入文件?

如何将多个 byte[] 数组合并到一个文件中?

提前致谢:)

您为 bytesList 中的每个元素创建了一个新的 FileOutputStream。这些输出流中的每一个都在文件的开头 处开始写入文件 。所以你最终会覆盖所有字节,直到 bytes-list.

的最后一个元素

您要做的是仅创建 一个 FileOutputStream 并将其用于所有 write(bytes) 调用。这样每个 write 都会附加到已经打开的文件。类似的东西:

public void createFile() throws IOException{
    FileOutputStream fos = new FileOutputStream(name);
    Iterator<byte[]> it = bytesList.iterator();
    while (it.hasNext())
        fos.write(it.next());
}

另外,根据您的 Java 版本,您可以通过使用 for each 循环来避免 Iterator

public void createFile() throws IOException {
    FileOutputStream fos = new FileOutputStream(name);
    for (byte[] data: bytesList)
        for.write(data);
}

回答 "FileOutputStream simply replaces the existing bytes with the new one, what is the alternative to writing into a file?"

FileOutputStream(File file, boolean append) 

这是 FileOutputStream 的语法,因此您可以将 append 设置为 true :)

回答"How do I combine multiple byte[] arrays into a single file?"

您可以使用 addAll 方法。这是一个例子:

    List<byte[]> listFinal = new ArrayList<byte[]>();
    listFinal.addAll(listA);
    listFinal.addAll(listB);