2017-11-07 16 views
-1

Javaを使用してインターネットからファイルをダウンロードしようとしていますが、問題があります。私は失敗しませんが、ダウンロードしようとするたびに、ファイルサイズはそれよりも大きいにもかかわらず250-300 KBしかダウンロードされません。私はたくさんの方法を試しましたが、結果が同じだと毎回。Javaを使用してインターネットからファイルをダウンロードできません

私は、私は、のようないくつかの stackoverflowのソリューションをも続いてきた、このよう

import java.io.FileOutputStream; 
import java.net.URL; 
import java.nio.channels.Channels; 
import java.nio.channels.ReadableByteChannel; 

public class Main { 

    public static void main(String[] args) { 

     try { 

      String from = "https://download.gimp.org/mirror/pub/gimp/v2.8/gimp-2.8.10.tar.bz2"; 
      String to = "/home/ashik/gimp-2.8.10.tar.bz2"; 
      System.out.println("Starting!"); 
      ReadableByteChannel rbc = Channels.newChannel(new URL(from).openStream()); 
      FileOutputStream fos = new FileOutputStream(to); 
      fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); 
      fos.close(); 
      rbc.close(); 
      System.out.println("Finished!"); 
     } catch (Exception e) { 

      System.err.println(e.toString()); 
     } 
    } 

} 

のJava NIOを試してみました

import java.io.File; 
import java.net.URL; 

import org.apache.commons.io.FileUtils; 

public class Main { 

    public static void main(String[] args) { 

     try { 

      String from = "https://download.gimp.org/mirror/pub/gimp/v2.8/gimp-2.8.10.tar.bz2"; 
      String to = "/home/ashik/gimp-2.8.10.tar.bz2"; 
      System.out.println("Starting!"); 
      FileUtils.copyURLToFile(new URL(from), new File(to), Integer.MAX_VALUE, Integer.MAX_VALUE); 
      System.out.println("Finished!"); 
     } catch (Exception e) { 

      System.err.println(e.toString()); 
     } 
    } 
} 

、このようはApache CommonsのIOを試してみました

How to download and save a file from Internet using Java?How to download large sized Files (size > 50MB) in javaなどですが、いずれも機能していません。

ダウンロードするたびにファイルサイズはわずか250〜300 KBです。この問題を解決するには?

プラットフォーム:

OS:Debianの-9

JDK-バージョン:OracleのJDK-9

IDE:酸素

Eclipseは、事前にありがとうございます。

+0

は、受け入れ答えのコメントの一つは言う:「単一の呼び出しが適切でないtransferFrom()ありえません'が1回の呼び出しで転送全体を完了するように指定されているので、カウントを返します。ループする必要があります。 – NAMS

+0

ああ、次に 'FileUtils.copyURLToFile()'について教えてください。なぜそれは働いていないのですか? – ashik

+0

私はCommons IOに精通していませんが、正しく書かれていると言うことができる限り、何が間違っているのか分かりません。あなたはそれを実行すると例外が発生していますか? – NAMS

答えて

0

これを行うには、サードパーティのライブラリは必要ありません。あなたがチャンネルを使用することができますが、それはFiles.copyを使用するために短いです:

try (InputStream stream = new URL(from).openStream()) { 
    Files.copy(stream, Paths.get(to)); 
} 

あなたのケースでは、URLは、別の場所にリダイレクトされます。通常、setInstanceFollowRedirectsを呼び出すことで十分です:

HttpURLConnection conn = new URL(from).openConnection(); 
conn.setInstanceFollowRedirects(true); 

try (InputStream stream = conn.getInputStream()) { 
    Files.copy(stream, Paths.get(to)); 
} 

ただし、これは特殊なケースです。あなたのURLはhttpsのURLで、httpのURLにリダイレクトされます。

Javaは安全ではないと考えているので、setInstanceFollowRedirectsが呼び出されたとしても、そのリダイレクトに自動的に従うことはありません。あなた自身リダイレクト従わなければならない意味

:リンクされた最初の質問で

URL url = new URL(from); 

HttpURLConnection conn; 
while (true) { 
    conn = (HttpURLConnection) url.openConnection(); 
    conn.setInstanceFollowRedirects(true); 

    int responseCode = conn.getResponseCode(); 
    if (responseCode != HttpURLConnection.HTTP_MOVED_PERM && 
     responseCode != HttpURLConnection.HTTP_MOVED_TEMP && 
     responseCode != 307) { 

     break; 
    } 

    url = new URL(conn.getHeaderField("Location")); 
} 

try (InputStream stream = conn.getInputStream()) { 
    Files.copy(stream, Paths.get(to)); 
} 
+0

ご返信ありがとうございます。私はこれを試しましたが、結果は同じです。私は自分のコードと出力を添付しています。これを確認してください。 **コード:** https://gist.github.com/ashikuzzaman-ar/50a8aee9eaf86424c358c7121f52fe93 **コンソール:** https://drive.google.com/file/d/1E-vIKUZuAEC2uRIkKUZqqYFWW3GTFB-X/view?usp = sharing ** File_Browser:** https://drive.google.com/file/d/1aDX27pQvJqdFvUoV7hDa1wDBYeSfStyStyle/view?usp=sharing – ashik

+0

ああ、今すぐ表示されます。 URLはリダイレクトしています。それに応じて私の答えを更新。 – VGR

+0

はい!私もそれを発見した!私はコードを実行するたびに、サイズ250-300 KBのhtmlファイルをダウンロードしていました。ありがとうございます。 – ashik

関連する問題