2012-05-10 2 views
0

org.apache.commons.io.FileUtils.copyURLToFileでダウンロードを中断することはできますか?Apache Commons copyURLToFile - コピーを停止できますか?

私は1つのライン

org.apache.commons.io.FileUtils.copyURLToFile(new URL(url), targetFile); 

私は外からすぐにダウンロードを停止すると、別のスレッドを持っています。

ありがとうございました!私はcopyURLToFile(とは思わない

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

)がこれをサポートして、あなたはおそらくコピーを停止すべきならば、あなたは、各ブロック間で確認することができ、入力ストリームから読み取られ、ファイルに書き込むブロック単位を実装する必要があります。 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; 
} 
関連する問題