SwingWorker
doInBackground
で実行される入出力ストリームを停止したかったのです。タスクをキャンセルするたびに、ファイルはまだ作成されています(下記のコードを参照)。タスクは単純です。「すべてのファイル名(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);
}
});
、キャンセルメッセージは、タスクがキャンセルされていないという意味、コンソールに印刷されていませんキャンセルボタンを押すたびに、出力ファイルはまだ成功メッセージで作成されます。どうやってこれを止めることができますか?どんな助け?
でキャンセルをトリガできるようにするために
doInBackground
方法により作成された抽出への参照を維持する必要があります'ResourceFileExtract'はいくつかの手段を取り消してリソースを正しく処分する必要があります – MadProgrammer@MadProgrammer私は' ResourceFileExtract'を私のワーカーとともにローカルクラスにする必要がありますか? –
"ローカルクラス"はこれと関係がないとは思いません。 1)作業者はリソースオブジェクトを参照するフィールドを必要とし、2)このオブジェクトは、そのようにしたいときに何とか自分自身を取り消すことができる必要があります。これはその性質の一部である必要があります、それはコードです。 –