0

是否可以使用 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();
4

2 回答 2

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();
}
于 2012-05-11T12:46:44.790 回答
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;
}
于 2012-05-11T12:57:03.517 回答