2012-04-18 56 views
0

]我需要做的是使用DataStream发送多个文件。我通过发送文件的名称,然后是文件的字节来完成此操作。我需要发送不确定数量的文件。这是DataOutputStream的代码。从DataInputStream中读取几个字节[

  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

你为什么写每个字节分开,而不是一次性写入整个字节数组? – 2012-04-18 19:34:15

+0

@JonSkeet没有特别的理由。这样做会更好吗? – Stripies 2012-04-18 19:36:10

+0

你是如何初始化你的DataInputStream的。你确定它初始化正确吗?你是否一步一步确定它只读一次,并死亡?是你真正阅读文件的内容,还是你没有阅读任何内容,因为初始化不正确? – Churk 2012-04-18 19:37:06

回答

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); 
    } 
} 
0

这不是做的方式......你为什么不干脆存档所有你想在归档发送的文件(如JAR或ZIP)?在接收端,您可以提取存档。 Java有一个可以使用的内置JAR实现(在java.util.jar包中)。

您发送可变长度的消息
+1

这只是一个实现的意见,压缩或jaring的事情可能不会在一个选项。除非你是在外地出口,否则一定要陈述“那不是做这件事的方法”。 – Churk 2012-04-18 19:42:15

+0

好吧,显然我提供了一个实现这里提出的问题。为什么不是一种选择?例如,我认为GMail会在档案中传输多个文件附件。 – smichak 2012-04-18 19:52:51

+0

Gmail的功能并不意味着它的最佳做法,Gmail允许您一个一个下载,所以您的意思是什么?告诉别人不是做事的方式,因为你的意见更有效?您尚未提供技术问题的任何有效解决方案,您可以概述另一种实现,即您不提供任何工作代码来支持您的声明。让我们试着看看作者试图解决什么问题,然后再添加更多的问题。 – Churk 2012-04-18 19:57:00