2011-11-16 76 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之间的简单分块复制就没问题。你可以将它包装在缓冲流中。

相关问题