2010-11-14 14 views
12

Sto riscontrando alcuni problemi durante l'eliminazione di un file in Windows con java. Per qualche ragione, java sta tenendo un blocco sul mio file, e non so perché. Qui è il mio codice:Rilascio del blocco di file Java in Windows

private byte[] getFileByteArray(File file) { 
    try { 
     RandomAccessFile raf = new RandomAccessFile(file, "r"); 
     FileChannel channel = raf.getChannel(); 
     try { 

      ByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size()); 
      byte[] bt = new byte[buffer.remaining()]; 
      buffer.get(bt); 
      channel.close(); 
      raf.close(); 
      file.delete(); 
      return bt; 

     } catch (Exception ex) { 
      //Logger.getLogger(ConnectionImpl.class.getName()).log(Level.SEVERE, null, ex); 
      System.out.println(ex.toString()); 
     } 

    } catch (FileNotFoundException ex) { 
     Logger.getLogger(ConnectionImpl.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    return null; 
} 

File.Delete(), così come cercare manualmente Explorer rifiuta di eliminare il file in quanto è ancora in uso. Comunque, tutto sembra bene in Linux.

Mi manca un close() somehwhere? Posso confermare che il metodo che rende il file in primo luogo è la chiusura del file, in quanto posso eliminare il file prima di eseguire il codice precedente utilizzando file.delete()

Informazioni aggiuntive: Il codice di cui sopra fa parte di un metodo chiamato getFileByteArray (del file) e viene chiamato in questo modo:

public byte[] createReport(int id) { 

    Report report = new Report(); 
    String filename = report.CreateReport(id); 
    return getFileByteArray(new File(filename)); 
} 

Grazie

Aggiornamento: sono riuscito a risolvere il problema con la lettura del file di kilobyte per kilobyte nella matrice di byte utilizzando ByteArrayOutputStream

Come poster di seguito menzionato, vi è un bug noto in Java in quanto Windows ha problemi con la mappatura dei file.

+0

Ho provato questo codice in Windows casella il file viene sempre eliminato tramite il codice solo –

+0

@ org.life.java, in modo da dire il mio codice sopra funziona? Tuttavia in Windows Explorer non è possibile eliminarlo ?? – jtnire

+0

puoi pubblicare il tuo intero metodo e chiamare il post principale modificato –

risposta

15

Si tratta di un bug noto in Java su Windows, vedere Bug #4715154

Sun ha valutato il problema e ha chiuso il bug con la seguente spiegazione:

Non possiamo risolvere il problema. Windows non consente l'eliminazione di un file mappato. Questo problema dovrebbe essere migliorato un po 'una volta che sistemiamo i nostri garbage collector su deallocate i buffer diretti più prontamente (vedi 4469299), ma altrimenti c'è niente che possiamo fare a riguardo.

+0

System.gc() è quindi! – jtnire

+0

Bene, ho provato System.gc() sul mio Win7, ma non funziona, anche con NULLifying e sleep. Vorrei andare con la soluzione alternativa Do-Not-Use-NIO in questo caso. – mhaller

+0

Non utilizzare NIO? Puoi fare un esempio per favore? – jtnire

0

Aggiungendo a mhaller 's answer

e traducendo sarumont' s commento in codice

Questo dovrebbe/può funzionare.

private static void deleteMappedFilesIfExists(Path path) throws IOException { 
    while (true) { 
     try { 
      Files.deleteIfExists(path); 
      break; 
     } catch (AccessDeniedException e) { 
      System.gc(); 
     } 
     //Add delay if needed. 
    } 
} 
Problemi correlati