编程语言
首页 > 编程语言> > java-ArrayList和文件传输问题

java-ArrayList和文件传输问题

作者:互联网

我正在创建一个TFTP服务器.我已经很好地传输了文件,但是当它们到达另一端时,大多数文件都不会打开.这是因为用于存储每个收到的数据包中文件字节的ArrayList im的输出将字节的负载添加到文件的开头.例如. “¬srjava.util.ArrayListxÒ™ÇaI 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中.

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

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

>将字节写入列表
>将列表中的字节写入字节数组
>将字节数组写入文件.

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

标签:arraylist,file-transfer,java
来源: https://codeday.me/bug/20191101/1982654.html