2011-11-11 5 views
11

Sono consapevole che questa domanda è un duplicato furioso della domanda this. Tuttavia,, ora ho letto l'intera pagina due volte, e alcune sezioni 3 volte, e per la vita di me non vedo come/dove viene risposto!Eliminazione file Java 6

Quindi, per il mio problema.

Sono al lavoro e sono bloccato utilizzando Java 6 SE e non posso aggiornare a 7. Sto scrivendo un programma che crea un file, scrive su di esso, esegue un po 'di elaborazione, e quindi ha bisogno di eliminare il file fuori esistenza. Sto avendo lo stesso identico problema della persona che ha posto la domanda di cui sopra: Java non cancellerà il file e non riesco a capire perché.

Il codice:

File f = null; 
FileWriter fw = null; 
try 
{ 
    f = new File("myFile.txt"); 
    fw = new FileWriter(f); 
    fw.write("This is a sentence that should appear in the file."); 
    fw.flush(); 
    if(f.delete()) 
     System.out.println("File was successfully deleted."); 
    else 
     System.err.println("File was not deleted."); 
} 
catch(Exception exc) 
{ 
    System.err.println(exc.getMessage()); 
} 
catch(Error er { 
    System.err.println(er.getMessage()); 
} 
catch(Throwable t) 
{ 
    System.err.println(t.getMessage()); 
} 
finally 
{ 
    fw.close(); 
} 

Non è gettando eventuali throwables, errori o eccezioni (ho incluso quelli per escludere eventuali casi e tutti i bordi). La seconda stampa ("File was not deleted.") viene stampata sulla console. Sto eseguendo questo su Windows 7 e sto scrivendo in una cartella in cui ho le autorizzazioni complete (rwx).

L'utente che ha fatto la domanda a cui ho fatto riferimento ha risposto alla sua domanda, ma lo fa (a mio modesto parere) in un modo non così semplice. In ogni caso, sto avendo problemi a dare un senso a ciò. Sembra alludere al fatto che l'utilizzo di uno BufferedReader rispetto a uno FileInputStream ha fatto la differenza per lui/lei, ma io non vedo come ciò si applica.

Java 7 sembra aver risolto questo problema con l'introduzione di una classe java.nio.file.Files, ma ancora una volta, non posso utilizzare Java 7 per motivi al di fuori del mio controllo.

Altri risponditori a tale domanda di riferimento alludono che si tratta di un "bug" in Java e forniscono tutti i tipi di aggiramenti, ad esempio chiamando esplicitamente System.gc(), ecc. Ho provato tutti questi e non funzionano.

Forse qualcuno può aggiungere una nuova prospettiva e fare jogging pensando a me.

+0

Non penso che sia un duplicato. Poiché hai provato le soluzioni suggerite dall'altra domanda e non hanno aiutato, è probabile che la causa sia diversa. – finnw

+2

Chiudilo per primo. E ... "bloccato usando Java 6?" Non conosco una singola azienda in esecuzione su JDK7. Conosco molti che sono su 1.4 e 1.5. Considerati fortunato. –

+0

si prega di notare quello che hai detto è opposto: utilizzando FileInputStream invece di BufferedReader è ciò che ha funzionato per l'utente nell'altro post. Per quanto riguarda il motivo per cui si applica, alcuni commenti suggeriscono un bug in Java. –

risposta

17

Si sta tentando di eliminare() un file a cui fa ancora riferimento un FileWriter attivo e aperto.

Prova questo:

f = new File("myFile.txt"); 
fw = new FileWriter(f); 
fw.write("This is a sentence that should appear in the file."); 
fw.flush(); 
fw.close(); // actually free any underlying file handles. 
if(f.delete()) 
    System.out.println("File was successfully deleted."); 
else 
    System.err.println("File was not deleted."); 
8

È possibile eliminare solo il file se non c'è Filehandler lasciato aperto. Poiché apri il file hanlder utilizzando FileWriter, dovrai chiuderlo prima di poterlo eliminare. In altre parole, f.delete deve essere eseguito dopo fw.close

Prova il codice qui sotto. Ho apportato le modifiche per evitare tutti i possibili bug che potresti trovare, ad esempio se fw è nullo.

File f = null; 
FileWriter fw = null; 
try { 
    f = new File("myFile.txt"); 
    fw = new FileWriter(f); 
    fw.write("This is a sentence that should appear in the file."); 
    fw.flush(); // flush is not needed if this is all your code does. you data 
       // is automatically flushed when you close fw 
} catch (Exception exc) { 
    System.err.println(exc.getMessage()); 
} finally {// finally block is always executed. 
    // fw may be null if an exception is raised in the construction 
    if (fw != null) { 
     fw.close(); 
    } 
    // checking if f is null is unneccessary. it is never be null. 
    if (f.delete()) { 
     System.out.println("File was successfully deleted."); 
    } else { 
     System.err.println("File was not deleted."); 
    } 
}