2013-10-28 85 views
0

我想用JAVA發送文件。我的問題是,客戶端永遠不知道文件的末尾是否到達。所以客戶端的while循環永遠不會結束。請幫幫我。InputStream read()方法永遠不會返回-1(Java)

服務器(將數據發送到客戶端)

File myFile = new File("C://LEGORacers.exe"); 

     byte[] mybytearray = new byte[(int) myFile.length()]; 
     BufferedInputStream bis = null; 
     OutputStream os = null; 

     bis = new BufferedInputStream(new FileInputStream(myFile)); 
     bis.read(mybytearray, 0, mybytearray.length); 

     os = socket.getOutputStream();  
     os.write(mybytearray, 0, mybytearray.length);  
     os.flush(); 

     bis.close(); 

客戶端(從服務器獲取數據)

byte[] buf = new byte[1024]; 
    InputStream is = null; 
    int bytesRead = 0; 

    is = client.getInputStream(); 
    FileOutputStream fos = null; 
    fos = new FileOutputStream("C://copy.exe"); 


    BufferedOutputStream bos = new BufferedOutputStream(fos); 

    try { 
      while (-1 != (bytesRead = is.read(buf, 0, buf.length))) { 
      // This while loop never ends because is.read never returns -1 and I don't know why... 

       bos.write(buf, 0, bytesRead); 
      } 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
       is.close(); 
       bos.flush(); 
       bos.close(); 
       fos.close(); 

     } 
+0

按電源按鈕! –

+0

可能的重複:http://stackoverflow.com/q/19383169/260633 – Dev

回答

1

您是否在服務器上關閉了您的OutputStream?如果沒有,您的循環可能會永久性地將bytesRead設置爲0,因此您可能需要關閉該流。

如果您需要服務器的OutputStream在發送數據後仍然打開,您還可以在數據流開始處以字節爲單位發送數據大小,然後循環,直到您獲得服務器指出的所有字節發送。

1

在服務器上關閉插座輸出流。 Flushing不會終止流,這是您需要做的發送服務器完成寫入的信號。從你發佈的內容來看,我沒有看到在服務器端關閉輸出流的位置。

+0

文件傳輸只是整個程序的一部分。當我關閉輸出流時,連接丟失。 –

相關問題