我需要做的是使用DataStreams发送多个文件。我这样做是通过发送文件的名称,然后是文件的字节。我需要发送一个不确定数量的文件。这是DataOutputStream
代码。
out.writeUTF(path);
out.write(Files.readAllBytes(file.toPath()));
它为每个需要发送的文件执行此操作。但我不知道如何使用DataInputStream
正确阅读。这是我到目前为止所做的。
while (in.available() != 0) {
String path = in.readUTF();
byte bytes = in.readByte();
}
显然它不起作用,因为它只读取一个字节。但我不知道如何让它读取所有字节。由于有几个文件正在被发送,所以当我读到所有文件的末尾时,available()
只会等于0。非常感谢任何帮助。
我完全忘记提及的一些事情,我希望能够在不耗尽内存的情况下发送大文件,我认为这不会起作用。我想我需要使用缓冲区,但我不知道哪个类支持文件。
答案 0 :(得分:2)
无论何时发送可变长度消息,您都需要一些方法来标记每种方法的开头和结尾。
List<File> files = someListOfFilesYouWantToSend;
out.writeInt(files.size());
for(File file : files){
out.writeUTF(path);
out.writeLong(file.getTotalSpace());
out.write(Files.readAllBytes(file.toPath()));
}
然后阅读它你会做这样的事情
int filesToRead = in.readInt();
for(int i = 0; i < filesToRead; i++){
String path = in.readUTF();
long bytesToRead = in.readLong();
FileOutputSteam fos = new FileOutputStream(path);
byte[] buffer = new byte[1024];
while(bytesToRead > 0){
bytesRead = in.read(buffer,0,bytesToRead > buffer.length ? buffer.length : bytesToRead);
bytesToRead -= bytesRead;
fos.write(buffer);
}
}
答案 1 :(得分:0)
这不是这样做的方法...为什么不简单地归档你想要在档案中发送的所有文件(如JAR或ZIP)?在接收方,您可以提取存档。 Java有一个可以使用的内置JAR实现(在java.util.jar包中)。