2011-11-16 123 views
2

我正在尋找一種在Java中使用TCP的客戶端和服務器進程之間傳輸文件的有效方法。我的服務器代碼看起來像這樣:Java中的客戶端 - 服務器文件傳輸

socket = serverSocket.accept(); 
InputStream is = socket.getInputStream(); 
OutputStream os = socket.getOutputStream(); 

FileInputStream fis = new FileInputStream(new File(filename)); 

我只是不確定如何繼續。我知道我想從fis讀取字節,然後將它們寫入os,但我不確定使用Java中的字節流讀取和寫入字節的最佳方式。我只使用作家和讀者熟悉書寫/閱讀文本。任何人都可以告訴我適當的方式來做到這一點?我應該怎麼包裝在osfis(如果有的話),我如何一直保持到文件末尾讀取的字節沒有hasNext()方法(或同等學歷)

+0

FTP庫? SSH文件傳輸庫(JSch)?沒有? – ecle

+0

我沒有使用FTP的經驗,但如果你能推薦一個好的Java FTP庫,那麼我一定會看看。 –

+0

對於FTP服務器部分,您可以使用Apache MINA FTP服務器庫[http://mina.apache.org/ftpserver/embedding-ftpserver-in-5-minutes.html](http://mina.apache.org/ ftpserver/embedding-ftpserver-in-5-minutes.html) – ecle

回答

3

你可以這樣做:

byte[] contents = new byte[BUFFER_SIZE]; 
int numBytes =0; 
while((numBytes = is.read(contents))>0){ 
    os.write(contents,0,numBytes); 
} 
+0

我看過SO帖子,建議通過可序列化的對象方式直接進行客戶端 - 服務器文件傳輸,如上面的OP代碼片段:對於網絡延遲較高的大文件是否可靠? – ecle

+0

@eee這篇文章中的代碼是你需要的。序列化整個文件並不是一個好主意:它只是增加了上面的空間和時間成本。 – EJP

+0

這正是我所期待的。很簡單,只是沒有足夠的經驗與BufferedStreams知道如何做到這一點 –

2

你可以使用Apache的IOUtils.copy(IN,OUT)或

import org.apache.commons.fileupload.util.Streams; 
... 
Streams.copy(in, out, false); 

檢查源可能證明有趣。 (http://koders.com?)

有一個帶有transferTo方法的java.nio.Channel,在社區中有不同的意見,對於更小/更大的文件更好。

Input/OutputStream之間的簡單分塊複製就沒問題。你可以將它包裝在緩衝流中。

相關問題