Can';t使用java从internet下载文件
我正在尝试使用java从internet下载文件,但有一个问题。我没有失败,但每次我尝试下载时,它只下载了250-300 KB,尽管文件大小大于这个值。我尝试了很多方法,但每次结果都是一样的 我曾经尝试过这样的Apache Commons IOCan';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
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));
}