2012-10-28 2 views
0

웹 서버에서 파일을 다운로드하는 Java 응용 프로그램을 만들고 있습니다. 이 파일은 816kb zip 파일입니다. 3 개의 다른 컴퓨터에서 응용 프로그램을 테스트했지만 한 컴퓨터에서는 작동하지 않습니다. 그 중 하나의 경우 파일의 13kb 만 다운로드 한 다음 중지합니다. 나는 htaccess로 로그를 확인하면 나는이를 참조하십시오Java가 zip 파일 다운로드를 완료하지 않습니다.

A : "GET /cache.zip HTTP/1.1"200 816938 "-" "모질라/4.0 (윈도우 7 6.1) 자바/1.7.0_07"

b : "GET /cache.zip HTTP/1.1"200 134320 "-"Mozilla/4.0 (Windows 7 6.1) Java/1.7.0_09 "

(PC a는 작동 중이고 PC b는 작동하지 않음)

나는 자바로 파일을 다운로드하는 많은 방법을 시도해 왔지만, 모든면에서 13kb 이후에는 다운로드를 중단한다. 또한 512m 메모리로 te 응용 프로그램을 실행하려했지만 문제가되지 않습니다.

이것은 내가 지금 무엇을 가지고 :

DataInputStream in = new DataInputStream(conn.getInputStream()); 
DataOutputStream out = new DataOutputStream(new FileOutputStream(new File(Config.CACHE_DIR+File.separator+"cache.zip"))); 
byte[] data = new byte[1024]; 

while((count = in.read(data,0,1024)) >= 0){ 
    out.write(data, 0, count); 
} 

하지만 while 루프는 그래서이 in.read

+6

java는 서버의 내용에 영향을 미치지 않습니다. 두 개의 서로 다른 크기의 응답을 생성하는 두 개의 동일한 URL 요청이있는 경우 다른 작업이 진행 중입니다. –

+0

출력 스트림을 닫으시겠습니까? – olyanren

+0

예, while 루프 이후 –

답변

0

실행 간단한 독립형 테스트, 문제가 있는지 확인

import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.URL; 

public class Scratch { 

public static void main(String[] args) throws IOException { 
    URL url = new URL("http://url.to.zip"); 

    InputStream in = url.openStream(); 
    FileOutputStream out = new FileOutputStream("test.zip"); 
    byte[] buffer = new byte[1024]; 
    int read = 0; 
    while ((read = in.read(buffer)) >= 0) { 
     out.write(buffer, 0, read); 
    } 
} 

} 
0

나는 보통 스트림 사이의 복사에 아파치 코 몬즈 IO IOUtils.copy()를 사용에 걸리면 멈추지 않을 것입니다. 버퍼를 사용하여 한 스트림에서 다른 스트림으로 바이트를 복사합니다.

덧붙여서 데이터 귀하의 경우에는 InputStream 및 DataOutputStream 래퍼를 사용할 필요가 없습니다. InputStream과 FileOutputStream을 직접 사용할 수 있습니다. IOUtils와

, 코드가 될 것이다 :

InputStream in = conn.getInputStream(); 
File outputFile = new File(Config.CACHE_DIR + File.separator + "cache.zip"); 
OutputStream out = new FileOutputStream(outputFile); 
try { 
    IOUtils.copy(in, out); 
} finally { 
    output.close(); 
} 

당신이 IOUtils를 사용하지 않으려면 ...

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

답변 해 주셔서 감사합니다.하지만 외부 라이브러리를 사용하지 않고 해결책을 찾고 있습니다. –

+1

라이브러리없이 대답을 제공하도록 업데이트되었습니다. –

+0

시도했지만 작동하지 않습니다. 또한 NIO 방법을 시도했지만 작동하지 않습니다. 나는 그것이 2 PC's에서 일하고 있기 때문에 1 PC에서 일하고 있지 않기 때문에 그것을 다운로드하려고하는 PC의 문제라고 생각한다. –

관련 문제