2017-01-14 86 views
0

我在写一个文件传输协议,其中文件是 在服务器和客户端之间以每个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(字节)简单地用新的替换现有的字节,什么是替代书写成一个文件?

如何将多个byte []数组组合成单个文件?

感谢提前:)

+0

这不是'写';使用1-arg字符串(或文件)ctor **创建'FileOutputStream'会截断任何现有文件**。您应该在'createFile'中创建_one_流,然后''将'_all_缓冲区写入该流,然后'关闭'或至少'flush'它;在某些文件系统中不刷新或关闭可能会丢失数据。 –

+0

您不能依靠'<512'作为EOF指示。短时间读取可以随时发生,文件可以是512字节的倍数。你不需要一个叠加的分组协议来传输文件:标准的Java复制循环就可以完成。在编写任何文件之前,您既不需要也不想在汇编文件的所有字节。不清楚你在问什么。 – EJP

+0

看到我的答案[这里](http://stackoverflow.com/questions/10367698/java-multiple-file-transfer-over-socket)为正确的方式来做到这一点。 – EJP

回答

0

你在你的bytesList创建每个元素的新FileOutputStream。每个输出流开始写入文件的文件的起始。所以你最终覆盖所有的字节,直到你的字节列表的最后一个元素。

你想要做的只是创建一个一个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版本,你可以使用每个循环避免Iterator

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

谢谢:)解决了它! – Dolav

0

答案为“FileOutputStream中简单地用新的替换现有的字节,写入文件有什么选择?“

FileOutputStream(File file, boolean append) 

这是FileOutputStream中的语法,所以你可以把追加为真:)

回答“我如何合并多个字节[]数组到一个单一的文件?”

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

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