2010-11-14 5 views
12

Ich habe einige Probleme beim Löschen einer Datei in Windows mit Java. Aus irgendeinem Grund hält Java meine Datei fest und ich weiß nicht warum. Hier ist mein Code:Java-Dateisperre in Windows freigeben

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(), sowie versuchen, manuell im Explorer die Datei löschen verweigert, da sie immer noch in Gebrauch sind. Unter Linux scheint alles gut zu sein.

Vermisse ich ein close() irgendwo? Ich kann bestätigen, dass die Methode, die die Datei an erster Stelle macht, die Datei schließt, da ich die Datei vor dem Ausführen des obigen Codes mit file.delete() löschen kann

Zusätzliche Informationen: Der obige Code ist Teil eines Verfahrens wie folgt aufgerufen getFileByteArray (File-Datei) und wird genannt:

public byte[] createReport(int id) { 

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

Dank

Update: ich es geschafft, das Problem zu beheben durch das Lesen der Datei Kilobyte durch Kilobyte in das Byte-Array mit ByteArrayOutputStream

Als ein Poster unten erwähnt, gibt es einen bekannten Fehler in Java, dass Windows Probleme mit der Dateizuordnung hat.

+0

habe ich versucht, diesen Code in Windows-Box die Datei durch den Code –

+0

@ org.life.java nur gelöscht wird immer, so dass Sie meinen meine obigen Code funktioniert? Aber im Windows Explorer können Sie es nicht löschen ?? – jtnire

+0

können Sie Ihre gesamte Methode als auch Aufruf Teil –

Antwort

15

Dies ist ein bekannter Fehler in Java unter Windows finden Sie in Bug #4715154

Sun das Problem und geschlossen den Fehler mit der folgenden Erklärung bewertet:

Wir können nicht dieses Problem beheben. Windows lässt nicht zu, dass eine zugeordnete Datei gelöscht wird. Dieses Problem sollte etwas verbessert werden, sobald wir unsere Müllsammler zu direkten Puffer schneller freigeben (siehe 4469299) beheben, aber sonst gibt es nichts, was wir dagegen tun können.

+0

System.gc() es ist dann! – jtnire

+0

Nun, ich habe versucht System.gc() auf meinem Win7, aber es funktioniert nicht, auch mit NULLifying und schlafen. Ich würde in diesem Fall mit der Do-Not-Use-NIO-Problemumgehung gehen. – mhaller

+0

NIO nicht verwenden? Kannst du bitte ein Beispiel geben? – jtnire

0

Hinzufügen zu mhaller 's answer

Und sarumont übersetzen' s Kommentar in Code

Diese sollte/arbeiten kann.

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