【发布时间】:2012-05-20 22:47:49
【问题描述】:
我正在创建一个 TFTP 服务器。我可以很好地传输文件,但是大多数文件到达另一端时都不会打开。这是因为 ArrayList 的输出用于存储接收到的每个数据包中的文件字节,将字节负载添加到文件的开头。例如。 “¬í sr java.util.ArrayListxÒ™Ça I sizexp w ur [B¬óøTà xp ü!”。首先使用列表的原因是即时创建的服务器无法告诉正在接收的文件的文件大小。因此,据我所知,我不能使用 byte[] 因为它需要用设定的长度进行初始化。有没有办法解决这个问题?
WRQ WRQ = new WRQ();
ACK ACK = new ACK();
DatagramPacket outPacket;
byte[] bytes;
byte[] fileOut;
List fileBytes = new ArrayList();
outPacket = WRQ.firstPacket(packet);
socket.send(outPacket);
socket.receive(packet);
while (packet.getLength() == 516){
bytes = WRQ.doWRQ(packet);
fileBytes.add(bytes);
outPacket = ACK.doACK(packet);
socket.send(outPacket);
socket.receive(packet);
}
bytes = WRQ.doWRQ(packet);
fileBytes.add(bytes);
outPacket = ACK.doACK(packet);
socket.send(outPacket);
ObjectOutputStream os;
ByteArrayOutputStream byteStream = new ByteArrayOutputStream(5000);
os = new ObjectOutputStream(new BufferedOutputStream(byteStream));
os.flush();
os.writeObject(fileBytes);
os.flush();
byte[] outFile = byteStream.toByteArray();
os.close();
FileOutputStream foStream = new FileOutputStream(filename);
foStream.write(outFile);
foStream.close();
【问题讨论】:
-
请输入代码。看起来您刚刚(默认)将
ArrayList序列化为一个文件。 -
你到底是怎么写数据的?使用 writeObject 序列化数组列表?必须写入字节而不是数组列表。
-
您是否验证了服务器在其
ArrayList中具有正确的字节?如果是这样,您可能只需要更改用于写入目标文件的方法。 -
上面后期编辑中的代码。我只是用写。我如何只写字节?
-
您不只是使用 write,而是使用 writeObject()(序列化)。不要将字节添加到列表中,而是将它们写入 OutputStream。
标签: java arraylist file-transfer