Come scoprire quale thread sta chiudendo un file in java?
-
24-09-2019 - |
Domanda
Sto cercando di eliminare un file che un altro thread nel mio programma ha già lavorato con.
Sono in grado di eliminare il file, ma io non sono sicuro di come capire quale thread può essere utilizzando il file.
Quindi, come faccio a sapere quale thread si blocca il file in java?
Soluzione
Non ho una risposta diretta (e non credo che ci sia uno o, questo è controllato a livello di OS-(nativo), non a JVM-livello) e anche io non vedo proprio il valore di la risposta (non è ancora possibile chiudere il file a livello di codice, una volta scoperto che si tratta di filo), ma penso che non si sa ancora che l'incapacità di eliminare solito è causato quando il file è ancora aperto. Questo può accadere quando si fa non in modo esplicito chiamare Closeable#close()
sul InputStream
, OutputStream
, Reader
o Writer
che è costruito intorno al File
in questione.
demo di base:
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
}
In altre parole, in modo che tutta la vostra roba di Java IO il codice è corretto chiusura le risorse dopo l'uso. L'idioma normale è quello di fare questo in la dichiarazione try-with-resources
, in modo che si può essere certi che le risorse saranno liberate in ogni caso, anche in caso di un IOException
. Per es.
try (OutputStream output = new FileOutputStream(file)) {
// ...
}
Fallo per qualsiasi InputStream
, OutputStream
, Reader
e Writer
, ecc qualunque implementa AutoCloseable
, che si sta aprendo soli (utilizzando la parola chiave new
).
Questo non è tecnicamente necessario in alcune implementazioni, come ByteArrayOutputStream
, ma per ragioni di chiarezza, solo aderire il primo in-finalmente linguaggio ovunque equivoci evitare e refactoring-insetti.
Nel caso in cui non sei su Java 7 o più recente ancora, quindi utilizzare invece il sottostante try-finally
idioma.
OutputStream output = null;
try {
output = new FileOutputStream(file);
// ...
} finally {
if (output != null) try { output.close(); } catch (IOException logOrIgnore) {}
}
Spero che questo aiuti inchiodare la causa principale del vostro problema particolare.
Altri suggerimenti
A proposito di questa domanda, ho anche cercare di scoprire questa risposta, e chiedere questa domanda e trovare risposta:
Ogni volta che JVM frenafiletti un file in esclusiva, anche serratura JVM alcuni Jave oggetto , per esempio, ho trovato nel mio caso:
- sun.nio.fs.NativeBuffer
- sun.nio.ch.Util $ BufferCache
Quindi è necessario solo trovare questo oggetto Java bloccato e li analizzate e a trovare quello filo bloccato il file.
Non sicuro che funziona se il file appena aperto (senza bloccato in modo esclusivo), ma sono sicuro che è il lavoro se il file bloccato esclusivamente da Discussione (utilizzando java.nio.channels.FileLock, java.nio.channels. FileChannel e così via)
Più informazioni vedi questa domanda