write reading files java file-io temporary-files

reading - write to a file in java



¿hay una eliminación FileInputStream existente al cerrar? (4)

¿Existe alguna forma de que un FileInputStream elimine el archivo subyacente automáticamente cuando se cierra?

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

edición: caso de uso es que tengo una acción de Struts 2 que devuelve un InputStream para la descarga de archivos desde una página. Por lo que puedo decir, no me avisan cuando finaliza la acción o si FileInputStream ya no está en uso, y no quiero que los archivos temporales (potencialmente grandes) que se generan se descarguen. .

La pregunta no era específica de Struts 2, así que no incluí esa información originalmente y compliqué la pregunta.


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

EDITAR : En 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();} }


No hay tal cosa en las bibliotecas estándar, y tampoco ninguna de las librerías de apache-commons, 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; } } } }


Sé que esta es una pregunta antigua, pero acabo de encontrarme con este problema y encontré otra respuesta: javax.ws.rs.core.StreamingOutput.

Así es como lo usé:

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();


Sé que esta es una pregunta bastante antigua; sin embargo, es uno de los primeros resultados en Google, y Java 7+ tiene esta funcionalidad integrada:

Path path = Paths.get(filePath); InputStream fileStream = Files.newInputStream(path, StandardOpenOption.DELETE_ON_CLOSE);

Sin embargo, hay un par de advertencias con este enfoque, están escritas here , pero lo esencial es que la implementación hace un esfuerzo por eliminar el archivo cuando se cierra el flujo de entrada, y si eso falla hace otro intento de esfuerzo cuando la JVM termina. Está diseñado para su uso con archivos temporales que solo utiliza una instancia de la JVM. Si la aplicación es sensible a la seguridad, también hay algunas otras advertencias.