Apache Commons copyURLToFile - 可以停止复制吗?

时间:2012-05-10 13:45:30

标签: java apache-commons

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

2 个答案:

答案 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;
}