2012-05-10 26 views
0

是否可以使用org.apache.commons.io.FileUtils.copyURLToFile中斷下載?Apache Commons 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

我不認爲copyURLToFile()支持這一做,你可能需要實現從InputStream逐塊的讀取和寫入文件,那麼你可以在每個塊之間是否複製應停止。 BLOCK_SIZE是一個可調參數,具體取決於預期的下載大小以及它對停止信號的反應速度。

I.e.類似如下(可能是越野車,並沒有真正運行它):

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(); 
} 
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; 
} 
相關問題