2012-04-18 54 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