2010-11-14 36 views
12

Tengo algunos problemas para eliminar un archivo en Windows con Java. Por alguna razón, java mantiene un bloqueo en mi archivo, y no sé por qué. Aquí está mi código:Liberar bloqueo de archivos Java en 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(), así como tratar de forma manual en el Explorador se niega a eliminar el archivo, ya que todavía está en uso. Sin embargo, todo parece estar bien en Linux.

Me estoy perdiendo un cerrar() en algún lugar? Puedo confirmar que el método que hace el archivo en primer lugar es cerrar el archivo, ya que puedo eliminar el archivo antes de ejecutar el código anterior usando file.delete()

Información adicional: El código anterior es parte de un método llamado getFileByteArray (archivo) y que se llama así:

public byte[] createReport(int id) { 

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

Gracias

actualización: he conseguido solucionar el problema mediante la lectura de la kilobytes de archivos por kilobyte en el conjunto de bytes con ByteArrayOutputStream

Como se menciona a continuación, hay un error conocido en Java en el sentido de que Windows tiene problemas con la asignación de archivos.

+0

yo probamos este código en la caja ventanas el archivo se elimina a través de conseguir código sólo –

+0

@ org.life.java, lo que significa que mi código de arriba funciona? Sin embargo, en el explorador de Windows no puede eliminarlo ?? – jtnire

+0

puede publicar todo el método, así como llamar a la parte –

Respuesta

15

Esto es un error conocido en Java en Windows, por favor ver Bug #4715154

Sun evalúa el problema y cerró el error con la siguiente explicación:

No podemos solucionar este problema. Windows no permite que se elimine un archivo asignado. Este problema debería mejorarse algo una vez que arreglemos nuestros recolectores de basura a desasignar los almacenamientos intermedios directos con mayor prontitud (consulte 4469299), pero de lo contrario está nada que podamos hacer al respecto.

+0

System.gc() es entonces! – jtnire

+0

Bueno, probé System.gc() en mi Win7, pero no funciona, incluso con NULLify y durmiendo. Me gustaría ir con la solución Do-Not-Use-NIO en este caso. – mhaller

+0

¿No usa NIO? ¿Puedes dar un ejemplo, por favor? – jtnire

0

Agregando a mhaller 's answer

y traducir sarumont' s comentario en código

Este debe/pueden trabajar.

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