java - temporales - win setup files borrar
Tomcat 6: ¿cómo eliminar archivos temporales después de que ha finalizado una llamada al método web? (3)
Tengo un archivo temporal con datos que se devuelven como parte de una respuesta SOAP a través de un archivo adjunto binario MTOM. Me gustaría descargarlo tan pronto como la llamada al método "termine" (es decir, termine de transferir). ¿Cuál es la mejor manera para que yo haga esto? La mejor forma de averiguar cómo hacerlo es borrarlos cuando se destruya la sesión, pero no estoy seguro de si hay una manera más "inmediata" de hacerlo.
FYI, NO estoy usando Axis, estoy usando jax-ws, si eso importa.
ACTUALIZACIÓN: No estoy seguro de que los que responden realmente entiendan el problema. Sé cómo eliminar un archivo en Java. Mi problema es este:
@javax.jws.WebService
public class MyWebService {
...
@javax.jws.WebMethod
public MyFileResult getSomeObject() {
File mytempfile = new File("tempfile.txt");
MyFileResult result = new MyFileResult();
result.setFile(mytempfile); // sets mytempfile as MTOM attachment
// mytempfile.delete() iS WRONG
// can''t delete mytempfile because it hasn''t been returned to the web service client
// yet. So how do I remove it?
return result;
}
}
¿Estás usando archivos temporales estándar de Java? Si es así, puedes hacer esto:
File script = File.createTempFile("temp", ".tmp", new File("./"));
... use the file ...
script.delete(); // delete when done.
la carpeta de trabajo que configuró en el contexto para esta aplicación web de la que está hablando. ¿Puedes establecer este directorio de trabajo en un directorio conocido? Si es así, entonces puede encontrar el archivo temporal dentro del directorio de trabajo temporal (que usted conoce). Una vez que lo encuentre, puede eliminarlo.
Me encontré con este mismo problema. El problema es que la pila JAX-WS administra el archivo. No es posible determinar en su código cuando JAX-WS ha terminado con el archivo por lo que no sabe cuándo eliminarlo.
En mi caso, estoy usando un DataHandler en mi modelo de objetos en lugar de un archivo. MyFileResult tendría el siguiente campo en lugar de un campo de archivo:
private DataHandler handler;
Mi solución fue crear una versión personalizada de FileDataSource. En lugar de devolver un FileInputStream para leer el contenido del archivo, devuelvo la siguiente extensión de FileInputStream:
private class TemporaryFileInputStream extends FileInputStream {
public TemporaryFileInputStream(File file) throws FileNotFoundException {
super(file);
}
@Override
public void close() throws IOException {
super.close();
file.delete();
}
}
Esencialmente, el origen de datos permite leer solo una vez. Una vez que la transmisión se cierra, el archivo se elimina. Como la pila JAX-WS solo lee el archivo una vez, funciona.
La solución es un poco hack pero parece ser la mejor opción en este caso.