Закрытие FileInputStream, используемого потоком результатов Struts - PullRequest
4 голосов
/ 25 ноября 2011

Мое веб-приложение создает файл XML.Я использую результат потока Struts2 для управления загрузкой, вот действие в 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>

Вот часть класса действия "GenerateXML", где создается FileInputStream "inputStream":

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

Удаление файла не будет работать, потому что inputStream еще не закрыт (эта часть закомментирована).Однако, если я закрою его в этот момент, xml-файл, загруженный пользователем, будет пустым, поскольку его поток был закрыт до того, как Struts сгенерирует загрузку.Помимо использования скрипта, который регулярно удаляет эти временные файлы на сервере, есть ли способ закрыть «inputStream» ПОСЛЕ того, как распоряжения сделали свое дело?

Ответы [ 2 ]

3 голосов
/ 25 ноября 2011

Тебе не нужно этого делать.Struts2 позаботится о том, чтобы закрыть сам пар, все, что вам нужно сделать, это создать входной поток и установить его.

Вот как Struts2 обрабатывает закрытие потока для вас

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

    }

Так какПоток - это тип результата в struts2. Он выбирает данные из потока, который вы определили, сбрасывая его, а ден закрывает его.

Надеюсь, это очистит ваши сомнения.

3 голосов
/ 25 ноября 2011

Нет удаления при закрытии входного потока, но вы можете написать свой собственный. См. существует ли существующее удаление FileInputStream при закрытии? .

Идея состоит в том, что вы не передаете FileInputStream, а передаете свой ClosingFileInputStream, который переопределяет close и удаляет файл при вызове close. Функция close () будет вызываться распорками:

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

См. Связанный вопрос для получения дополнительной информации.

...