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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top