7

プログラム内の別のスレッドが以前に処理したファイルを削除しようとしています。

ファイルを削除できませんが、ファイルを使用している可能性のあるスレッドを特定する方法がわかりません。

では、Javaでファイルをロックしているスレッドを見つけるにはどうすればよいですか?

4

2 に答える 2

7

正解はありません(また、正解もないと思います。これは、JVMレベルではなく、OSレベル(ネイティブ)で制御されます)。また、答えの価値も実際にはわかりません(どのスレッドであるかを確認した後でも、プログラムでファイルを閉じることはできません)が、ファイルがまだ開いているときに削除できないことが通常発生することはまだわかりません。これは、、、、または問題の周りに構築された、を明示的に呼び出さない場合に発生する可能性があります。Closeable#close()InputStreamOutputStreamReaderWriterFile

基本的なデモ:

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)) {
    // ...
}

(キーワードを使用して)自分で開いている、、、、などの実装をすべて実行します。 InputStreamOutputStreamReaderWriterAutoCloseablenew

これは、などの特定の実装では技術的には必要ありませんがByteArrayOutputStream、わかりやすくするために、誤解やリファクタリングのバグを避けるために、どこにでも近いイディオムを適用するだけです。

Java 7以降をまだ使用していない場合は、try-finally代わりに以下のイディオムを使用してください。

OutputStream output = null;
try {
    output = new FileOutputStream(file);
    // ...
} finally {
    if (output != null) try { output.close(); } catch (IOException logOrIgnore) {}
}

これがあなたの特定の問題の根本的な原因を突き止めるのに役立つことを願っています。

于 2010-02-01T15:18:53.530 に答える