2011-11-16 4 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에서 바이트 스트림을 사용하여 바이트를 읽고 쓰는 가장 좋은 방법은 확실하지 않습니다. 필자는 Writers and Readers를 사용하여 글쓰기/읽기에만 익숙합니다. 누구든지이 일을 할 수있는 적절한 방법을 말해 줄 수 있습니까? 나는에 osfis 무엇을 포장한다 (어떤 경우) 어떻게 내가 당신과 같이 할 수

+0

FTP 라이브러리? SSH 파일 전송 라이브러리 (JSch)? 아니? – ecle

+0

FTP에 대한 경험이 없지만 좋은 Java FTP 라이브러리를 추천 할 수 있다면 분명히 살펴볼 것입니다. –

+0

FTP 서버 부분의 경우 Apache MINA FTP 서버 라이브러리 [http://mina.apache.org/ftpserver/embp-pubs-in-/5-minutes.html] (http : //mina.apache.org/)를 사용할 수 있습니다. ftpserver/embedding-ftpserver-in-5-minutes.html) – ecle

답변

3

hasNext() 방법 (또는 동급)없이 파일의 마지막까지 읽어 바이트를 보관하지 :

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

위의 OP의 코드 조각처럼 직렬화 가능한 객체 접근 방식을 통해 직접 클라이언트 - 서버 파일 전송을 제안하는 SO 게시물을 보았습니다. 네트워크 대기 시간이 긴 대용량 파일의 경우 신뢰할 수 있습니까? – ecle

+0

@eee이 게시물의 코드 만 있으면됩니다. 전체 파일을 일련 화하는 것은 좋은 생각이 아닙니다. 단지 위와 같이 공간과 시간을 추가하는 것입니다. – EJP

+0

이것은 정확히 내가 찾고 있었던 것이었다. 매우 간단합니다. BufferedStreams에 대한 경험이 부족하여 직접 수행하는 방법을 알지 못했습니다. –

2

을 당신 아파치의 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 간의 간단한 블록 별 사본은 괜찮습니다. 버퍼링 된 스트림으로 래핑 할 수 있습니다.

관련 문제