2017-01-14 4 views
0

SwingWorkerdoInBackgroundで実行される入出力ストリームを停止したかったのです。タスクをキャンセルするたびに、ファイルはまだ作成されています(下記のコードを参照)。タスクは単純です。「すべてのファイル名(String)が指定されているので、指定された名前でこのファイルを出力します(そのようなもの)。SwingWorkerで実行される入出力ストリームのキャンセル/強制終了

IOストリームを別のパッケージ/クラスに書きました。コードは次のようになります。

public class ResourceFileExtract(String outputFile) { 
    InputStream inputStream = null; 
    OutputStream outputStream = null; 
    try { 
    inputStream = getClass().getResourceAsStream("/resources/someFile"); 
    outputStream = new FileOutputStream(outputFile); 
    byte[] bytes = new byte[1024]; 
    int numbers; 
    while ((numbers = inputStream.read(bytes)) > 1) { 
     outputStream.write(bytes, 0, length) 
    } 
    outputStream.flush(); 
    outputStream.close(); 
    inputStream.close(); 
    } /* Other codes here */ 
} 

SwingWorkerの設定です。

private class BackgroundTask extends SwingWorker<Integer, String> { 
    @Override 
    protected Integer doInBackground() { 
    /* Some codes here */ 
    if (!isCancelled()) { 
     for (/* Loop statement */) { 
     try { 
      // Input and Output stream called from a class... 
      ResourceFileExtract fileExtract = new ResourceFileExtract(specifiedOutputName); 
      System.out.println("Done (file extracted successfully)"); 
     } catch (IOException ex) { 
      System.out.println("Error (unable to read resource file)"); 
      return 0; 
     } 
     } 
    } else { 
     // These texts are not printed in console... 
     System.out.println("Cancelled (I/O streaming stopped)"); 
     return 0; 
    } 
    return 0; 
    } 
} 

で実行SwingWorkerの:

JButton start = new JButton("Start"); 
start.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent evt) { 
    BackgroundTask bgTask = new BackgroundTask(); 
    bgTask.execute(); 
    } 
}); 

としてキャンセル:プログラムをデバッグ中

JButton stop = new JButton("Stop"); 
stop.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent evt) { 
    bgTask.cancel(true); 
    } 
}); 

、キャンセルメッセージは、タスクがキャンセルされていないという意味、コンソールに印刷されていませんキャンセルボタンを押すたびに、出力ファイルはまだ成功メッセージで作成されます。どうやってこれを止めることができますか?どんな助け?

+1

でキャンセルをトリガできるようにするためにdoInBackground方法により作成された抽出への参照を維持する必要があります'ResourceFileExtract'はいくつかの手段を取り消してリソースを正しく処分する必要があります – MadProgrammer

+0

@MadProgrammer私は' ResourceFileExtract'を私のワーカーとともにローカルクラスにする必要がありますか? –

+0

"ローカルクラス"はこれと関係がないとは思いません。 1)作業者はリソースオブジェクトを参照するフィールドを必要とし、2)このオブジェクトは、そのようにしたいときに何とか自分自身を取り消すことができる必要があります。これはその性質の一部である必要があります、それはコードです。 –

答えて

3

基本的には、あなたのResourceFileExtractクラスが

あなた SwingWorkerで次に
public class ResourceFileExtract { 

    private String outputFile; 
    private AtomicBoolean cancelled = new AtomicBoolean(false); 

    public ResourceFileExtract(String outputFile) { 
     this.outputFile = outputFile; 
    } 

    public void cancel() { 
     cancelled.set(true); 
    } 

    public void extract() throws IOException { 

     try (InputStream inputStream = getClass().getResourceAsStream("/resources/someFile"); 
       OutputStream outputStream = new FileOutputStream(outputFile)) { 
      byte[] bytes = new byte[1024]; 
      int numbers; 
      while (!cancelled.get() && (numbers = inputStream.read(bytes)) > 1) { 
       outputStream.write(bytes, 0, numbers); 
      } 
     } catch (IOException exp) { 
      throw exp; 
     } 
    } 
} 

、あなたがcancelとして(いくつかの種類が「停止」、独自の方法を提供する必要があります...何らかの方法例えば、キャンセルする必要がありますfinal:P)であり、cancelへの呼び出しのためにプロパティの変更イベントが発生することを保証することはできません。

労働者はまあ、あなたの労働者は `ResourceFileExtract`へのインスタンス参照を維持する必要があります、それが正常に抽出

+0

これを試してすぐに結果を出すでしょう:) –

+0

私はブロックI/Oを中断する能力について心配していました – MadProgrammer

+0

結果はちょうど私が欲しかったと期待されたものです。しかし、取り消しメッセージはまだ印刷されませんが、残っている唯一の問題です。とにかく私はそれに取り組むつもりです。もう一度ティヴォム。 –

関連する問題