【问题标题】:Problems with ArrayList and file transferArrayList 和文件传输的问题
【发布时间】: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


【解决方案1】:

您将字节数组存储在 ArrayList 中,然后使用 writeObject() 方法将整个 ArrayList 写入包装在 ObjectOutputStream 中的 ByteArrayOutputStream。

这使用本机对象序列化机制来保存 ArrayList 对象。它不会一个接一个地写入列表中的每个字节数组。明确一点:它使用对象序列化协议写入类名和ArrayList的内部结构。

您不需要 ArrayList。直接写入 ByteArrayOutputStream,甚至直接写入 FileOutputStream。照原样,您正在尝试

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

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

【讨论】:

  • 这听起来可以解决所有问题。你能帮我把它写成代码吗?
  • 您的代码中几乎已经包含了所有内容。如果你自己做,你会比我为你做的学到更多。
  • 我当然明白这一点。当我尝试在 while 循环中使用 BufferedOutputStream.write() 然后在它之后,我正在询问如何将其放入代码中的指针。它保存了文件,但里面没有任何内容。
猜你喜欢
  • 2016-04-15
  • 1970-01-01
  • 1970-01-01
  • 2012-08-08
  • 1970-01-01
  • 2022-10-01
  • 1970-01-01
  • 2013-05-15
  • 1970-01-01
相关资源
最近更新 更多