是否可以使用org.apache.commons.io.FileUtils.copyURLToFile中断下载?
我有一行单独的线程
org.apache.commons.io.FileUtils.copyURLToFile(new URL(url), targetFile);
我想立即从外面停止下载。
谢谢!
threadFetch = new Thread(){
@Override
public void run() {
try {
isFetching = true;
org.apache.commons.io.FileUtils.copyURLToFile(new URL(url), targetFile);
isFetching = false;
} catch (IOException ex) {
Logger.getLogger(YoutubeMovieLink.class.getName()).log(Level.SEVERE, null, ex);
}
}
};
threadFetch.start();
答案 0 :(得分:0)
我认为copyURLToFile()不支持这个,你可能需要从输入流实现逐块读取并写入文件,然后你可以检查每个块之间是否应该停止复制。 BLOCK_SIZE是一个可调参数,具体取决于预期的下载大小以及它对停止信号的响应速度。
即。类似下面的内容(可能是错误的,实际上没有运行它):
InputStream input = new URL(url).getInputStream();
try {
OutputStream output = new BufferedOutputSteam(new FileOutputStream(targetFile));
try {
byte[] block[BLOCK_SIZE];
while(!input.isEof()) {
if(shouldBeCancelled) {
System.out.println("Stopped!");
break;
}
// read block
int i = input.read(block);
if(i == -1) {
break;
}
// write block
output.write(block);
}
} finally {
output.close();
} finally {
input.close();
}
答案 1 :(得分:0)
我很确定还有更多其他方法,这个命令没有超时选项。
我在很多情况下也运行这种问题,所以我创建了一个小实用程序方法来运行带超时的命令,也许它可以帮到你:
public static <T> T runWithTimeout(Callable<T> task, int timeout) throws Exception{
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<T> future = executor.submit(task);
T result = future.get(timeout, TimeUnit.SECONDS);
executor.shutdown();
return result;
}