我想从URL
下载文件,我正在使用commons-io。在我下载的过程中,我想根据我要下载的文件类型设置超时。基本上,如果无法在指定时间内下载文件,该方法应该返回错误。
我查看javadocs并发现所有IO操作都是同步的(阻止IO操作) 是否有其他替代库提供与commons-io相同的效率和易用性?
答案 0 :(得分:2)
ExecutorService executorService = acquireExecutorService();
final int readTimeout = 1000;
final int connectionTimeout = 2000;
final File target = new File("target");
final URL source = new URL("source");
Future<?> task = executorService.submit(new Runnable() {
@Override
public void run() {
try {
FileUtils.copyURLToFile(source, target, connectionTimeout, readTimeout);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
});
try {
task.get(30, TimeUnit.SECONDS);
} catch (InterruptedException | ExecutionException e) {
//handle exceptions
} catch (TimeoutException e) {
task.cancel(true); //interrupt task
}
通过使用执行程序服务,您可以异步下载文件。 task.get(30, TimeUnit.SECONDS);
指定您希望等待下载完成的时间。如果没有及时完成,你可以尝试取消任务并中断它,虽然中断线程可能不会工作,因为我不认为FileUtils.copyURLToFile()
检查线程的中断标志。这意味着下载仍将在后台继续。如果您确实要停止下载,则必须自己实施copyURLToFile
并定期检查Thread.interrupted()
,以便在线程中断时停止下载。