2014-02-08 66 views
0
import java.io.BufferedInputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class Server { 

    public static void main (String [] args) throws IOException { 

      ServerSocket serverSocket = new ServerSocket(15123); 


      Socket socket = serverSocket.accept(); 
      System.out.println("Accepted connection : " + socket); 
      File transferFile = new File ("D:\\workspace\\SpringRmiClient.rar"); 
      byte [] bytearray = new byte [(int)transferFile.length()]; 
      FileInputStream fin = new FileInputStream(transferFile); 
      BufferedInputStream bin = new BufferedInputStream(fin); 
      bin.read(bytearray,0,bytearray.length); 
      OutputStream os = socket.getOutputStream(); 
      System.out.println("Sending Files..."); 
      os.write(bytearray,0,bytearray.length); 
      os.flush(); 
      socket.close(); 
      System.out.println("File transfer complete"); 

     } 
} 

上述程序將文件從一臺PC傳輸到另一臺PC。
但是,文件傳輸的速度是low
有沒有可用的選項來提高文件傳輸的速度?如何提高以下代碼的文件傳輸速度

+1

投資一個更快的網絡;-)順便說一句,不能保證'bin.read(bytearray,0,bytearray.length);'會讀取整個文件。 – Henry

回答

0

使用一個循環和一個較小的緩衝區。這將大大改善延遲:

byte[] buffer = new byte[8192]; 
int count; 
while ((count = in.read(buffer)) > 0) 
{ 
    out.write(buffer, 0, count); 
} 

此刻,在讀完整個文件之前,您不會傳輸任何內容。這樣你幾乎立即傳輸第一個字節,並且只要你閱讀它們就可以傳輸最後的字節。

您現在的代碼也:

  • 僅適用於文件大小< = Integer.MAX_VALUE;
  • 只適用於安裝到內存中的文件;和
  • 可能根本無法正常工作,因爲您無意中假設read()填充緩衝區。它只是強制讀取一個或多個字節。
+0

我試過了,但它太慢了,你能提出另一個想法 – KVK

+0

相比什麼太慢?你有沒有證據表明它可以像你期望的那樣快速發展? – EJP