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