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