Can';t使用java从internet下载文件

Can';t使用java从internet下载文件,java,Java,我正在尝试使用java从internet下载文件,但有一个问题。我没有失败,但每次我尝试下载时,它只下载了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

我正在尝试使用java从internet下载文件,但有一个问题。我没有失败,但每次我尝试下载时,它只下载了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解决方案,如、、等,但没有一个有效

每次下载时,文件大小只有250-300KB。如何解决这个问题

站台:

操作系统:Debian-9

JDK版本:Oracle JDK-9

IDE:Eclipse氧气


提前感谢您。

您不需要第三方库来执行此操作。您可以使用频道,但使用时间较短:

在您的情况下,URL将重定向到其他位置。通常,打电话就足够了:

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认为这是不安全的(应该如此),因此它永远不会自动遵循该重定向,即使调用了
setInstanceFlowRedirects

这意味着您必须自己遵循重定向:

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

在您链接的第一个问题中,接受答案的一条注释说:“一次调用是不够的。没有指定transferFrom()来在一次调用中完成整个传输。这就是它返回计数的原因。您必须循环。”哦,那么‘FileUtils.copyURLToFile()’是什么呢?为什么它不工作?我不太熟悉Commons IO,但据我所知,它写的是正确的,所以我不知道它出了什么问题。运行时是否出现异常?不要使用FileUtils和通道。使用。你们中的一个建议不要使用FileUtils和Channel,另一个不确定发生了什么,但你们也在做投票。伟大的不,没有引发异常。这是主要问题。它没有抛出任何异常,但无法下载该文件。顺便问一下,在哪里以及如何使用循环@你能详细描述一下我吗?谢谢你的回复。我试过这个,但结果是一样的。我正在附加我的代码和输出。请检查这个。代码:控制台:文件浏览器:啊,我现在明白了。URL正在进行重定向。相应地更新了我的答案。是的!我也发现了!发生了什么,每次我运行代码时,它都在下载一个大小为250-300KB的html文件。非常感谢,先生。你能告诉我怎样才能获得信息吗?几秒钟后我已经下载了多少位@VGR您必须一次读一点流,然后自己进行计算。使用一个方法调用是无法做到这一点的。已经有许多堆栈溢出问题解决了这个问题。
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));
}