gpt4 book ai didi

java - ArrayList 和文件传输的问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:22:16 24 4
gpt4 key购买 nike

我正在创建一个 TFTP 服务器。我可以很好地传输文件,但大多数文件在到达另一端时都无法打开。这是因为用于存储接收到的每个数据包的文件字节的 ArrayList im 的输出会向文件的开头添加大量字节。例如。 “¬í 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 写入包含在 ObjectOutputStream 中的 ByteArrayOutputStream。

这使用 native 对象序列化机制来保存 ArrayList 对象。它不会一个接一个地写入列表中的每个字节数组。说清楚一点:它使用对象序列化协议(protocol)编写类名和ArrayList的内部结构。

您不需要 ArrayList。直接写入 ByteArrayOutputStream,甚至直接写入 FileOutputStream。事实上,您正在尝试

  • 将字节写入列表
  • 将列表中的字节写入字节数组
  • 将字节数组写入文件。

直接写入输出文件(包装在 BufferedOutputStream 中进行缓冲)会更直接(也更高效)

关于java - ArrayList 和文件传输的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10674283/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com