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

时间:2017-01-14 19:07:52

标签: java file communication

我正在编写一个文件传输协议,其中包含文件 在服务器和客户端之间以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 []数组合并到一个文件中?

提前致谢:)

2 个答案:

答案 0 :(得分:0)

您为FileOutputStream中的每个元素创建了一个新的bytesList。每个输出流都开始写入文件的起始文件。所以你最终会覆盖所有字节,直到你的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);
}

答案 1 :(得分:0)

回答&#34; FileOutputStream只是用新的字节替换现有的字节,写入文件的替代方法是什么?&#34;

FileOutputStream(File file, boolean append) 

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

回答&#34;如何将多个byte []数组合并到一个文件中?&#34;

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

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