0

からファイルをダウンロードしたいのですが、そのためにcommons-ioURLを使用しています。ダウンロード中に、ダウンロードするファイルの種類に基づいてタイムアウトを設定したいと考えています。指定された時間内にファイルをダウンロードできなかった場合、メソッドは基本的にエラーを返します。

javadocsを調べたところ、すべての IO 操作が同期的 (IO 操作をブロックしている) であることがわかりました。commons-io と同じ効率と使いやすさを提供する他の代替ライブラリはありますか?

4

1 に答える 1

3

このようなことができます。

ExecutorService executorService = acquireExecutorService();

final int readTimeout = 1000;
final int connectionTimeout = 2000;
final File target = new File("target");
final URL source = new URL("source");

Future<?> task = executorService.submit(new Runnable() {
    @Override
    public void run() {
        try {
            FileUtils.copyURLToFile(source, target, connectionTimeout, readTimeout);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
});
try {
    task.get(30, TimeUnit.SECONDS);
} catch (InterruptedException | ExecutionException e) {
    //handle exceptions
} catch (TimeoutException e) {
    task.cancel(true); //interrupt task
}

Executor サービスを使用すると、ファイルを非同期でダウンロードできます。task.get(30, TimeUnit.SECONDS);ダウンロードが完了するまでの待機時間を指定します。FileUtils.copyURLToFile()間に合わない場合は、タスクをキャンセルして中断することもできますが、スレッドの中断フラグをチェックしないと思うので、スレッドの中断はおそらく機能しません。これは、ダウンロードが引き続きバックグラウンドで行われることを意味します。本当にダウンロードを停止したい場合は、スレッドが中断されたときにダウンロードを停止するために、copyURLToFile自分で実装して定期的にチェックする必要があります。Thread.interrupted()

于 2013-11-07T11:29:57.650 に答える