2016-11-30 81 views
0

數據,我有以下的代碼,我使用的文件發送到客戶端:Java的插座 - 重複去年寫

private void sendFile(Socket client) throws Exception { 
     byte[] data = new byte[4096]; 
     DataOutputStream dos = new DataOutputStream(client.getOutputStream()); 
     FileInputStream fis = new FileInputStream("test.txt"); 

     while (fis.read(data, 0, data.length) != -1) { 
      dos.write(data); 
     } 

     fis.close(); 
     dos.close(); 
} 

說我的發現是,文件大小後不同的問題轉讓。經過進一步調查,我發現文件在最後的dos.write(data)上被複制。

例子:

原始文件:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
Cras dictum diam neque, eu dictum sem efficitur ut. 
Ut eu hendrerit risus. 
In dapibus vel lectus at egestas. 

傳輸的文件:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
Cras dictum diam neque, eu dictum sem efficitur ut. 
Ut eu hendrerit risus. 
In dapibus vel lectus at egestas. 
Ut eu hendrerit risus. 
In dapib 

我在這裏束手無策,我已經看了上百個例子試圖解決這個問題。我試過dos.flush(),將讀取更改爲dos.read(data),並更改了while循環條件。我期望傳輸非常大的文件,所以我不想一次加載一個文件。

編輯:

我一直使用命令行兩種telnetnetcat測試下載。

+0

您需要檢查r來自讀取和寫入的eturn值。讀取的值告訴您讀了多少,並且可以安全地寫入。來自寫入的值告訴您寫了多少內容,並可能提示重試。 –

回答

1

看到這個方法

https://docs.oracle.com/javase/7/docs/api/java/io/DataOutputStream.html#write(byte[],%20int,%20int)

https://docs.oracle.com/javase/7/docs/api/java/io/FileInputStream.html#read(byte[],%20int,%20int)

len - 讀取的最大字節數。

,並返回

的總字節數讀入緩衝區

你只想要寫先前讀

所以

字節量
int br = -1; 
    while ((br = fis.read(data, 0, data.length)) != -1) { 
     dos.write(data, 0, br); 
    } 
+0

你的鏈接應該是'InputStream'的讀取。根本原因是海報假定讀取調用保證讀取的字節數與第三個參數中傳遞的字節數相同。當然,事實並非如此。 – pvg

+0

我認爲OP假定數組將被清除 –

+0

它可能不會被清除嗎? –