2011-01-14 11 views
19

¿Existe alguna forma de tener un FileInputStream para eliminar el archivo subyacente automáticamente cuando se cierra?¿hay una eliminación de FileInputStream existente al cerrar?

Estaba planeando hacer mi propia clase de utilidad para extender FileInputStream y hacerlo yo mismo, pero estoy un poco sorprendido de que no exista algo.

editar: El caso de uso es que tengo una acción de Struts 2 que devuelve InputStream para la descarga de archivos de una página. Por lo que puedo decir, no me notifican cuando la acción finaliza, o el FileInputStream ya no está en uso, y no quiero que los archivos temporales (potencialmente grandes) que se generan se descarguen dejados por ahí. .

La pregunta no era específica de Struts 2, por lo que no incluí esa información originalmente y complicar la pregunta.

+0

lo que es el caso de uso para esto? – skaffman

+2

@skaffman bastante obvio, después de leer el archivo que quiere eliminarlo (James Bond-Style, Esta cinta se autodestruirá después de este mensaje) –

+1

@Sean: Eso no es un caso de uso. Un caso de uso es lo que acaba de agregar a la pregunta. – skaffman

Respuesta

25

No hay tal cosa en las bibliotecas estándar, y no cualquiera de las librerías de Apache Commons tampoco, así que algo como:

public class DeleteOnCloseFileInputStream extends FileInputStream { 
    private File file; 
    public DeleteOnCloseFileInputStream(String fileName) throws FileNotFoundException{ 
     this(new File(fileName)); 
    } 
    public DeleteOnCloseFileInputStream(File file) throws FileNotFoundException{ 
     super(file); 
     this.file = file; 
    } 

    public void close() throws IOException { 
     try { 
      super.close(); 
     } finally { 
      if(file != null) { 
      file.delete(); 
      file = null; 
     } 
     } 
    } 
} 
+1

Anularía el archivo después de eliminarlo de cerca, solo para estar limpio en caso de que se llame más de una vez. –

+0

Gracias. Había planeado escribir el mío, pero estaba sorprendido de que no hubiera nada en las librerías estándar. No había revisado los bienes comunes de Apache. –

6

¿Se puede usar File.deleteOnExit() antes de abrir el archivo?

EDIT: Puede subclasificar un FileInputStream que eliminará el archivo en 'close()';

class MyFileInputStream extends FileInputStream 
{ 
File file; 
MyFileInputStream(File file) { super(file); this.file=file;} 
public void close() { super.close(); file.delete();} 
} 
+0

"File.createTempFile" posiblemente también sea útil. Parece que Shawn D necesita un archivo temporal. – Stas

+1

No, no puedo, ya que es una aplicación de larga ejecución. –

3

Sé que esto es una vieja pregunta, pero me acaba de ejecutar en este tema, y ​​encontró otra respuesta: javax.ws.rs.core.StreamingOutput.

Así es como lo utilicé:

File downloadFile = ...figure out what file to download... 
    StreamingOutput so = new StreamingOutput(){ 
     public void write(OutputStream os) throws IOException { 
      FileUtils.copyFile(downloadFile, os); 
      downloadFile.delete(); 
    } 

    ResponseBuilder response = Response.ok(so, mimeType); 
    response.header("Content-Disposition", "attachment; filename=\""+downloadFile.getName()+"\""); 
    result = response.build(); 
+0

¡Esto es genial y se ve como el tipo de clase que se suponía que tratara de devolver archivos temporales usando una solicitud web! –

Cuestiones relacionadas