2012-05-12 149 views
0

我想通過java中的套接字傳輸文件..實際上,我已經能夠傳輸..但是有一個問題發生..問題是文件發送的是縮小的..例如,我傳送300MB的文件,客戶端將只接收299mb ....我想知道可能是什麼問題..通過Java中的套接字傳輸文件

服務器端

File myFile = new File (basePath+"\\"+input.readUTF()); 
byte [] mybytearray = new byte [1024]; 
FileInputStream fis = new FileInputStream(myFile); 
BufferedInputStream bis = new BufferedInputStream(fis); 
txtArea.append("Sending... \n"); 
while (true) 
{ 
    int i = bis.read(mybytearray, 0, mybytearray.length); 
      if (i == -1) { 
     break; 
    } 
    output.write(mybytearray, 0, i); 
    txtArea.append("Sending chunk " + i + "\n"); 

} 
output.flush(); 

客戶端

output.writeUTF("get"); 
txtArea.append("Starting to recive file... \n"); 
       long start = System.currentTimeMillis(); 
       byte [] mybytearray = new byte [1024]; 
       txtArea.append("Connecting... \n"); 
       output.writeUTF(remoteSelection); 
       FileOutputStream fos = new FileOutputStream(basePath+"\\"+remoteSelection); 
       BufferedOutputStream bos = new BufferedOutputStream(fos); 
       int bytesRead = input.read(mybytearray, 0, mybytearray.length); 
       while(bytesRead != -1) 
       { 
        bos.write(mybytearray, 0, bytesRead); 
        txtArea.append("got chunk" + bytesRead +"\n"); 
        bytesRead = input.read(mybytearray, 0, mybytearray.length); 
       } 
bos.flush(); 
+5

您需要在寫入之前檢查-1,而不是之後。您也正在以Javadoc中特別警告的方式濫用available();你假設文件大小適合int;等等等等 – EJP

+0

加上EJP指出的,你也在BufferedInputStream上檢查可用,我猜它最多隻返回底層輸入流的緩衝區長度。 – dragon66

+0

那麼如何檢查文件的大小?我嘗試使用byte [] mybytearray = new byte [(int)myFile.length()];但是它返回一個錯誤..當我嘗試發送一個大文件時,它是堆外面..如600mb .. –

回答

2

的在Java中複製流的規範方法如下:

int count; 
byte[] buffer = new byte[8192]; // or whatever you like really, not too small 
while ((count = in.read(buffer)) > 0) 
{ 
    out.write(buffer, 0, count); 
} 

適用於任何長度輸入;不會將整個輸入加載到內存中;這樣做不會增加延遲。

如果您要發送多個文件,您需要先通過DataOutputStream.writeLong()發送長度;通過反函數在另一端讀取它;並在讀取完這麼多字節後調整讀取端的環路條件終止。不像它看起來那麼簡單;留給讀者作爲練習。

+0

我該如何檢查文件的長度? –

+0

@BobyHartanto Err,'File.length()?' – EJP

+0

感謝您的幫助 –