我正在尝试使用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
提前谢谢。
答案 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));
}