4

私のWebアプリケーションは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>

FileInputStream"inputStream"が作成されるアクションクラス"GenerateXML"の部分は次のとおりです。

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

inputStreamがまだ閉じられていないため、ファイルの削除は機能しません(その部分はコメント化されています)。ただし、この時点で閉じると、strutsがダウンロードを生成する前にストリームが閉じられたため、ユーザーがダウンロードしたxmlファイルは空になります。サーバー上のこれらの一時ファイルを定期的に削除するスクリプトを使用する以外に、strutsが処理を実行した後に「inputStream」を閉じる方法はありますか?

4

2 に答える 2

3

クローズ入力ストリームには削除はありませんが、独自に作成することはできます。クローズ時に既存のFileInputStream削除がありますか?。

FileInputStreamを渡さずに、ClosingFileInputStreamを渡すという考え方です。これにより、closeがオーバーライドされ、closeが呼び出されたときにファイルが削除されます。close()はstrutsによって呼び出されます。

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

詳細については、リンクされた質問を参照してください。

于 2011-11-25T10:27:10.377 に答える
3

あなたはそれをする必要はありません。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();
               }

    }

したがって、streamはstruts2の結果タイプであるため、定義したストリームからデータを選択してフラッシュし、データを閉じます。

それがあなたの疑問を解消することを願っています。

于 2011-11-25T10:44:19.497 に答える