1

我需要做的是使用 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。任何帮助是极大的赞赏。

我完全忘记提及的事情,我希望能够发送一个大文件而不会耗尽内存,我认为这不会奏效。我想我需要使用缓冲区,但我不知道哪个类支持文件。

4

2 回答 2

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);
  }
}
于 2012-04-18T20:56:53.090 回答
0

那不是这样做的方法...为什么不简单地将要发送的所有文件存档在存档中(例如 JAR 或 ZIP)?在接收方,您可以提取存档。Java 有一个可以使用的内置 JAR 实现(在 java.util.jar 包中)。

于 2012-04-18T19:35:48.920 回答