将多个 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);
我正在写一个文件传输协议,其中的文件是 在服务器和客户端之间以每个 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);