Java 从DataInputStream读取多个字节[]

Java 从DataInputStream读取多个字节[],java,stream,Java,Stream,我需要做的是使用数据流发送多个文件。我通过发送文件名,然后发送文件的字节来实现这一点。我需要发送一个数量待定的文件。这是DataOutputStream代码 out.writeUTF(path); out.write(Files.readAllBytes(file.toPath())); 它对每个需要发送的文件都这样做。但是我不知道如何使用DataInputStream正确阅读它。这就是我目前所拥有的 while (in.availabl

我需要做的是使用数据流发送多个文件。我通过发送文件名,然后发送文件的字节来实现这一点。我需要发送一个数量待定的文件。这是
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。非常感谢您的帮助


我完全忘了提到的一件事,我希望能够在不耗尽内存的情况下发送一个大文件,我认为这样做行不通。我想我需要使用一个缓冲区,但我不知道哪个类对文件支持缓冲区。

这不是实现缓冲区的方法。。。为什么不干脆将所有要发送的文件归档(比如JAR或ZIP)?在接收端,您可以提取归档文件。Java有一个内置的JAR实现(在包Java.util.JAR中),您可以使用它。

无论何时发送可变长度的消息,您都需要某种方法来标记每个方法的开始和结束

 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()));
 }
List files=somelistoffiles要发送的文件;
out.writeInt(files.size());
用于(文件:文件){
out.writeUTF(路径);
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);
  }
}
int filesToRead=in.readInt();
for(int i=0;i0){
bytesRead=in.read(buffer,0,bytesToRead>buffer.length?buffer.length:bytesToRead);
bytesToRead-=字节读取;
写入(缓冲区);
}
}

为什么要分别写入每个字节,而不是一次性写入整个字节数组?@JonSkeet没有特别的原因。这样做会更好吗?您是如何初始化DataInputStream的。你确定它是init正确吗?你有没有跨过一步,确定它只读了一次,然后就死了?您读取的内容真的是文件的内容吗,还是因为init不正确而没有读取任何内容?@Churk我正在使用
新的DataInputStream(socket.getInputStream())
@Stripies:这比最初看起来要难一点;您基本上是在发明自己的传输协议。如果已知文件小于数兆字节,我会查看协议缓冲区()并在GPB消息中发送每个文件,并使用元数据(文件名、文件大小等)进行增强。这只是对实现的看法,压缩或jaring可能不在选项中。注意声明
除非你是该领域的出口人员,否则这不是做这件事的方法。很明显,我正在为这里提出的问题提供一个实现方案。为什么这不是一种选择?例如,我认为GMail在一个档案中传输多个文件附件。GMail所做的,并不意味着它的最佳实践,GMail允许你一个接一个地下载,那么你的观点是什么?告诉别人不是因为你的意见更有效而做某事的方式?对于一个技术问题,您没有提供任何有效的解决方案,您概述了另一个实现,您没有提供任何工作代码来支持您的声明。让我们试着看看作者试图解决的问题,然后为他的问题添加更多内容。我只是提出了一个解决方案,在我看来,它为解决手头的问题提供了更好的方法。我不认为固执地用特定的方式解决问题有什么意义。当然还有很多其他的好方法。我只是提供一个。@smichak但是如果有多个大文件(10GB),它会不会耗尽内存?