我在写一个文件传输协议,其中文件是 在服务器和客户端之间以每个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 []数组组合成单个文件?
感谢提前:)
这不是'写';使用1-arg字符串(或文件)ctor **创建'FileOutputStream'会截断任何现有文件**。您应该在'createFile'中创建_one_流,然后''将'_all_缓冲区写入该流,然后'关闭'或至少'flush'它;在某些文件系统中不刷新或关闭可能会丢失数据。 –
您不能依靠'<512'作为EOF指示。短时间读取可以随时发生,文件可以是512字节的倍数。你不需要一个叠加的分组协议来传输文件:标准的Java复制循环就可以完成。在编写任何文件之前,您既不需要也不想在汇编文件的所有字节。不清楚你在问什么。 – EJP
看到我的答案[这里](http://stackoverflow.com/questions/10367698/java-multiple-file-transfer-over-socket)为正确的方式来做到这一点。 – EJP