プログラム内の別のスレッドが以前に処理したファイルを削除しようとしています。
ファイルを削除できませんが、ファイルを使用している可能性のあるスレッドを特定する方法がわかりません。
では、Javaでファイルをロックしているスレッドを見つけるにはどうすればよいですか?
プログラム内の別のスレッドが以前に処理したファイルを削除しようとしています。
ファイルを削除できませんが、ファイルを使用している可能性のあるスレッドを特定する方法がわかりません。
では、Javaでファイルをロックしているスレッドを見つけるにはどうすればよいですか?
正解はありません(また、正解もないと思います。これは、JVMレベルではなく、OSレベル(ネイティブ)で制御されます)。また、答えの価値も実際にはわかりません(どのスレッドであるかを確認した後でも、プログラムでファイルを閉じることはできません)が、ファイルがまだ開いているときに削除できないことが通常発生することはまだわかりません。これは、、、、または問題の周りに構築された、を明示的に呼び出さない場合に発生する可能性があります。Closeable#close()
InputStream
OutputStream
Reader
Writer
File
基本的なデモ:
public static void main(String[] args) throws Exception {
File file = new File("c:/test.txt"); // Precreate this test file first.
FileOutputStream output = new FileOutputStream(file); // This opens the file!
System.out.println(file.delete()); // false
output.close(); // This explicitly closes the file!
System.out.println(file.delete()); // true
}
つまり、Java IO全体を通して、コードが使用後にリソースを適切 に閉じていることを確認してください。通常のイディオムは、try-with-resources
ステートメントでこれを行うことです。これにより、の場合でも、とにかくリソースが解放されることを確認できますIOException
。例えば
try (OutputStream output = new FileOutputStream(file)) {
// ...
}
(キーワードを使用して)自分で開いている、、、、などの実装をすべて実行します。 InputStream
OutputStream
Reader
Writer
AutoCloseable
new
これは、などの特定の実装では技術的には必要ありませんがByteArrayOutputStream
、わかりやすくするために、誤解やリファクタリングのバグを避けるために、どこにでも近いイディオムを適用するだけです。
Java 7以降をまだ使用していない場合は、try-finally
代わりに以下のイディオムを使用してください。
OutputStream output = null;
try {
output = new FileOutputStream(file);
// ...
} finally {
if (output != null) try { output.close(); } catch (IOException logOrIgnore) {}
}
これがあなたの特定の問題の根本的な原因を突き止めるのに役立つことを願っています。