txt texto por modificar manejo linea leer guardar escribir datos crear como archivos archivo java struts2 download struts fileinputstream

texto - manejo de archivos en java netbeans



Cerrar un FileInputStream utilizado por el resultado de la cadena de struts (2)

No hay una eliminación en la transmisión de entrada cerrada, pero puede escribir la suya. ¿Ves si hay una eliminación de FileInputStream existente al cerrar? .

La idea es que no pase un FileInputStream, sino que pase su ClosingFileInputStream, que sobrescribe y elimina el archivo cuando se invoca close. El close () será llamado por struts:

public String execute() { File xml = new File(filename); ...//fill the file with stuff setInputStream(new ClosingFileInputStream(xml)); }

Consulte la pregunta vinculada para obtener más información.

Mi aplicación web genera un archivo XML. Estoy usando un resultado de secuencia de Struts2 para administrar la descarga, aquí está la acción en struts.xml:

<action name="generateXML" class="navigation.actions.GenerateXML"> <result type="stream"> <param name="contentType">text/xml</param> <param name="inputName">inputStream</param> <param name="bufferSize">1024</param> </result> ... </action>

Aquí está la parte de la clase de acción "GenerateXML" donde se crea el "InputStream" FileInputStream:

public String execute() { File xml = new File(filename); ...//fill the file with stuff try { setInputStream(new FileInputStream(xml)); } finally { //inputStream.close(); xml.delete(); } }

Eliminar el archivo no funcionará porque el inputStream aún no está cerrado (esa parte está comentada). Sin embargo, si lo cierro en este punto, el archivo xml descargado por el usuario está vacío ya que su flujo se cerró antes de que struts genere la descarga. Además de usar una secuencia de comandos que regularmente elimina esos archivos temporales en el servidor, ¿hay alguna manera de cerrar "inputStream" después de que Struts haya hecho su trabajo?


No necesitas hacer eso. Struts2 se encargará de cerrar el vapor en sí todo lo que necesita hacer es crear un flujo de entrada y configurarlo.

Aquí es cómo struts2 maneja el cierre de la secuencia para usted

public class StreamResult extends StrutsResultSupport { // removing all other code { // Flush oOutput.flush(); } finally { if (inputStream != null) inputStream.close(); if (oOutput != null) oOutput.close(); } }

Entonces, dado que stream es un tipo de resultado en struts2, lo que hace es seleccionar los datos de la transmisión que ha definido, lavarlos y cerrarlos.

Espero que aclare tu duda.