2010-05-20 3 views
0

애플릿과 함께 포장 된 파일을 클라이언트 컴퓨터로 복사하는 애플릿이있는 웹 응용 프로그램이 있습니다.getResourceAsStream은 전체 파일이 아닌 HttpInputStream을 반환합니다.

웹 서버에 배포하고 다음을 사용합니다. InputStream in = getClass(). getResourceAsStream ("filename");

in.available()은 시도한 모든 파일에 대해 항상 8192 바이트의 크기를 반환합니다. 즉, 클라이언트 컴퓨터에 파일을 복사 할 때 파일이 손상되었음을 의미합니다.

InputStream의 형식은 HttpInputStream (sun.net.protocol.http.HttpUrlConnection $ httpInputStream)입니다. 그러나 애플릿 뷰어에서 애플릿을 테스트하는 동안 파일은 잘 복사되고 리턴 된 InputStream은 파일의 바이트 크기를 갖는 BufferedInputStream 유형입니다. 파일 시스템의 getResourceStream을 사용하면 BufferedInputStream이 사용되고 http 프로토콜에서는 HttpInputStream이 사용됩니다.

파일을 완전히 복사하는 방법, HttpInputStream에 대한 크기가 제한되어 있습니까? 고마워요.

답변

3

in.available()은 스트림에서 읽을 수있는 총 바이트 수가 아니라 차단하지 않고 읽을 수있는 바이트 수를 알려줍니다.

public static long copyLarge(InputStream input, OutputStream output) 
     throws IOException { 
    byte[] buffer = new byte[DEFAULT_BUFFER_SIZE]; 
    long count = 0; 
    int n = 0; 
    while (-1 != (n = input.read(buffer))) { 
     output.write(buffer, 0, n); 
     count += n; 
    } 
    return count; 
} 
+0

감사합니다. Tdavies, 파일을 복사 할 수있었습니다. –

1

()는 항상 의미, 내가 노력 모든 파일에 대해 8192 바이트의 크기를 반환 파일이 in.available입니다 : 여기

org.apache.commons.io.IOUtils에서 OutputStreamInputStream 복사의 예 클라이언트 컴퓨터에 복사 할 때 손상되었습니다.

전혀 의미하지 않습니다!

in.available() 메서드는 차단하지 않고 읽을 수있는 문자 수를 반환합니다. 그것은 스트림의 길이가 아닙니다. 일반적으로, 스트림 내의 모든 바이트의 read (또는 스킵)를 제외하고, InputStream의 길이를 결정하는 방법은 없습니다.

는 (당신은 new FileInputStream("someFile").available()은 일반적으로 당신에게 파일 크기를주는 것을 관찰 할 수있다.하지만 그 동작은 사양에 의해 보장 하지, 그리고 확실히 파일의 일부 종류의 사실이며, 가능하면 파일 시스템의 일부 종류뿐만 아니라 파일의 크기를 얻는 더 좋은 방법은 new File("someFile").length()이지만 어떤 경우에는 작동하지 않습니다.)

전체 스트림의 내용을 복사하는 코드는 @tdavies answer code를 참조하십시오. 이런 종류의 일을 할 수있는 타사 라이브러리도 있습니다. 예 : org.apache.commons.net.io.Util.

+0

안녕하세요, 스티븐 감사합니다. –

관련 문제