2012-05-20 55 views
3

我正在創建一個TFTP服務器。我已經把它轉換成了文件,但是大多數文件在到達另一端時不會打開。這是因爲ArrayList im的輸出用於存儲接收到的每個數據包中的文件字節,從而將一系列字節添加到文件的開頭。例如。 「¬ísrjava.util.ArrayListxÒ™ÇaI sizexp w ur [B¬óøTàxpü!」。首先使用列表的原因是創建的服務器無法告訴正在接收的文件的文件大小。因此,據我所知,我不能使用一個字節[],因爲這需要使用設定的長度進行初始化。這有什麼辦法嗎?ArrayList和文件傳輸的問題

  WRQ WRQ = new WRQ(); 
      ACK ACK = new ACK(); 
      DatagramPacket outPacket; 
      byte[] bytes; 
      byte[] fileOut; 
      List fileBytes = new ArrayList(); 
      outPacket = WRQ.firstPacket(packet); 
      socket.send(outPacket); 

      socket.receive(packet); 

      while (packet.getLength() == 516){ 

      bytes = WRQ.doWRQ(packet); 
      fileBytes.add(bytes); 

      outPacket = ACK.doACK(packet); 
      socket.send(outPacket); 

      socket.receive(packet); 

      } 

      bytes = WRQ.doWRQ(packet); 
      fileBytes.add(bytes); 

      outPacket = ACK.doACK(packet); 
      socket.send(outPacket); 

      ObjectOutputStream os; 

      ByteArrayOutputStream byteStream = new ByteArrayOutputStream(5000); 
      os = new ObjectOutputStream(new BufferedOutputStream(byteStream)); 
      os.flush(); 
      os.writeObject(fileBytes); 
      os.flush(); 
      byte[] outFile = byteStream.toByteArray(); 
      os.close(); 

      FileOutputStream foStream = new FileOutputStream(filename); 
      foStream.write(outFile); 
      foStream.close(); 
+0

代碼請。看起來你只是(默認)將'ArrayList'序列化爲一個文件。 – esej

+1

您究竟是如何編寫數據的?使用writeObject序列化ArrayList?必須寫入字節而不是數組列表。 –

+0

您是否已驗證服務器在其「ArrayList」中具有正確的字節?如果是這樣,你可能只需要改變你用來寫入目標文件的方法。 – 101100

回答

4

您存儲字節數組在一個ArrayList,然後你寫全的ArrayList到包裹在一個ObjectOutputStream一個ByteArrayOutputStream,使用writeObject()方法。

這使用本機Object序列化機制來保存ArrayList對象。它不會逐個寫入列表中的每個字節數組。爲了說清楚:它使用對象序列化協議來寫入類名和ArrayList的內部結構。

您不需要ArrayList。直接寫入ByteArrayOutputStream,甚至直接寫入FileOutputStream。由於是,你要

  • 寫字節到列表
  • 寫在列表中到字節數組
  • 寫字節數組到一個文件中。

這將是更簡單(和有效的)來直接寫入到輸出文件中(包在用於緩衝的的BufferedOutputStream)

+0

這聽起來像它會解決一切。你可以幫我把代碼放進去嗎? – DMo

+0

你的代碼中已經有了幾乎所有的東西。如果你自己做,那麼你會學到更多的東西,而不是我爲你做的。 –

+0

我明白這一點。我曾經要求指出如何將它放入代碼中,因爲我試圖在while循環中使用BufferedOutputStream.write(),然後嘗試使用它。它保存文件,但完全沒有任何內容。 – DMo