2011-01-15 2 views
2
public void download(String url, String destination) { 
     BufferedOutputStream localBufferedOutputStream = null; 
     URLConnection localURLConnection = null; 
     InputStream localInputStream = null; 
     try { 
      URL localURL = new URL(url); 

      localBufferedOutputStream = new BufferedOutputStream(new FileOutputStream(destination)); 
      localURLConnection = localURL.openConnection(); 
      localInputStream = localURLConnection.getInputStream(); 

      byte[] arrayOfByte = new byte[1024]; 
      int i; 
      while ((i = localInputStream.read(arrayOfByte)) != -1) { 
       localBufferedOutputStream.write(arrayOfByte, 0, i); 
      } 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } finally { 
      try { 
       if (localInputStream != null) { 
        localInputStream.close(); 
       } 
       if (localBufferedOutputStream != null) { 
        localBufferedOutputStream.close(); 
       } 
      } catch (IOException localIOException3) { 
       System.out.println(localIOException3); 
      } 
     } 
    } 

내 응용 프로그램을 디버깅 중이며 조금 느립니다. 내 인터넷인지 궁금해. 이것은 자바에서 파일을 다운로드하는 적절한 방법입니까? 파일은 26MB입니다.자바에서 파일을 다운로드하는 가장 좋은 방법일까요?

+0

웹 브라우저에서 동일한 파일을 다운로드하면 어떻게됩니까? – skaffman

+0

자바 좋아해 : 정확하고 명확하지 않은 언어 – TheLQ

답변

3

항상 Apache와 같은 라이브러리를 찾아야합니다. 그들은 당신을 위해 모든 노력을했을 : http://commons.apache.org/io/api-release/org/apache/commons/io/FileUtils.html

내가

static String readFileToString(File file) 
      Reads the contents of a file into a String using the default encoding for the VM. 

꽤 많은

를 사용합니다. 대안으로 http://commons.apache.org/io/api-1.4/org/apache/commons/io/IOUtils.html

+0

copyURLToFile이 스트림보다 낫습니다. 아니면 스트림 자체입니까? – Kyle

+0

기본 인코딩을 사용하는 것은 특히이 경우에는 끔찍한 생각입니다. 즉, 프로그램이 실행되는 플랫폼에 따라 데이터가 다른 방식으로 손상된다는 의미입니다. –

0

확실히 좋은 방법은 아닙니다. 모든 예외를 버리는 코드는 거의 모든 것을 수행하는 최선의 방법입니다. 매개 변수로 usi g 문자열을 고려하지 않을 수도 있습니다. URI와 File이 좋은 대안이 될 것입니다.

스트림을 복사하려면 transferTo를 사용하는 것이 좋습니다.

1

이미 버퍼를 사용하고 있으므로 BufferedOutputStream을 생략 할 수 있습니다. 그러나 그것은 큰 차이를 만들지 않을 것입니다.

큰 차이를 만들 수있는 (또는하지 않을 수 있음) 것은 스트림 대신 using the nio channel classes입니다.

+0

그리고 훨씬 더 큰 버퍼를 사용할 수 있습니다. 8192. – EJP

1

단지 참조를 위해, 당신은 HtmlUnit과를 조사 할 수 있습니다 :

당신이 URL을 알고 있다면 (그래서 스트림)를 봐주세요. 이 프레임 워크를 사용하면 브라우저 리디렉션이있는 사이트에서도 파일을 다운로드 할 수 있습니다.

http://htmlunit.sourceforge.net/

+1

내가이 질문을 한 지 오래다. James James에 감사드립니다. 나는 아파치 방식으로가는 것을 기억한다. 나는 htmlunit을 최근에 체크 아웃하는 것을 기억하고 그것은 굉장한 페이지에서 javascript를 실행한다는 것을 알았다. 감사합니다 – Kyle

+1

당신이 약간의 발전을했다는 것을 듣고 좋았습니다. Btw, 파일 무결성 테스트 및 다운로드 인터럽트 처리 같은 것에 들어갔습니까? 또한, 관심이있을 수 있습니다 : http://stackoverflow.com/questions/4687615/how-to-achieve-transfer-file-between-client-and-server-using-java-socket/4687706#4687706 –

+0

나는 가지고있다. 아니. 내가 멈추고/다운로드를 재개하려고하는 것을 기억하고 나는 jdownloader 소스 코드를 보도록 제안되었지만 결코하지 않았다. 그 자원에 감사드립니다. – Kyle

관련 문제