2017-10-10 3 views
0

URL (http://.../File.mp4)을 사용하여 인터넷에서 파일을 다운로드하는 방법을 아는 사람이 있습니까? NIO를 사용하려고 시도하지만 항상 Integer.MAX_VALUE에서 스트림 끝. 내 파일은 2.5GB입니다.자바 - URL에서 파일을 다운로드하는 방법 Integer.MAX_VALUE보다 큰

내 코드 :

String url = "http://.../Somefile.mp4"; 
    String filename = "Path/to/file/Something.mp4"; 

    boolean koncano = false; 
    URLConnection conn = new URL(url).openConnection(); 
    conn.setRequestProperty("Range", "bytes=" + new File(filename).length() + "-"); 
    ReadableByteChannel rbc = Channels.newChannel(conn.getInputStream()); 
    long remain = conn.getContentLength(); 
    FileOutputStream fos = new FileOutputStream(filename, true); 

    while (!koncano) { 
     long downloaded = new File(filename).length(); 
     long buffer = (remain > 65536) ? 1 << 16 : remain; 

     while (remain > 0) { 
      long write = fos.getChannel().transferFrom(rbc, downloaded, buffer); 
      downloaded += write; 
      remain -= write; 

      if (write == 0) { 
       break; 
      } 
     } 

     if (remain <= 0) { 
      System.out.println("File is complete"); 
      rbc.close(); 
      fos.close(); 
      koncano = true; 
     } 
    } 
+1

스택 오버플로에 오신 것을 환영합니다! 디버깅 도움을 요청하는 질문 ("이 코드가 작동하지 않는 이유는 무엇입니까?")에는 원하는 동작, 특정 문제 또는 오류 및 질문 자체에서이를 재현하는 데 필요한 가장 짧은 코드가 포함되어야합니다. 분명한 문제 설명이없는 질문은 다른 독자에게 유용하지 않습니다. 참조 : [mcve]를 만드는 방법. '편집'링크를 사용하여 * 질문 *을 개선하십시오 - 의견을 통해 더 많은 정보를 추가하지 마십시오. 감사! – GhostCat

+0

외부 사이트 링크 사용 안함 - 여기에 예제 코드를 입력하십시오! – GhostCat

+0

나는 당신이'HttpURLConnection' 또는 sth를 사용하고 있다고 의심합니다. 비슷한 'ByteArrayInputStream'을 사용합니다. 즉, byte []와 Java 배열의 최대 길이는 Integer.MAX_VALUE입니다. – Thomas

답변

0

if (remain < 0) 사용

+0

문제. 충분한 [평판] (https://stackoverflow.com/help/whats-reputation)이 있으면 [모든 게시물에 주석 달기] (https://stackoverflow.com/help/privileges/comment) 할 수 있습니다. 대신, [질문자의 설명이 필요없는 답변을 제공하십시오] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-do- 대신). - [From Review] (리뷰/저품절 게시물/17580908) – Assafs

1

if (remain <= 0)에 긴 버전을 수정 해보십시오 :

long remain = connection.getContentLengthLong(); 

팁 : 파일이 분수로 압축 제공 될 수 있다면, 당신은 대응하는 Accept 헤더를 보낼 수 있고 선택적으로 GZipInputStream에 스트림을 래핑 할 수 있습니다.

관련 문제