无法使用java从Internet下载文件

时间:2017-11-07 21:32:09

标签: java

我正在尝试使用java从互联网上下载文件但是有问题。我没有失败,但每次我试图下载它时只下载250-300 KB只有文件大小大于此。我尝试了很多方法,但每次结果都是一样的。

我已经尝试过这样的 Apache Commons IO

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());
        }
    }
}

我已经尝试过这样的 Java NIO

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());
        }
    }

}

我还关注了一些 stackoverflow 解决方案,例如How to download and save a file from Internet using Java?How to download large sized Files (size > 50MB) in java等,但它们都没有工作。

每次下载但文件大小仅为250-300 KB。如何解决这个问题?

平台:

操作系统:Debian-9

JDK-版本:Oracle JDK-9

IDE:Eclipse Oxygen

提前谢谢。

1 个答案:

答案 0 :(得分: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));
}

然而,这是一个特例。您的网址是https网址,该网址会重定向到http网址。

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));
}