2

次のように、WEB-INFフォルダー内のリソースへのInputStreamを取得できます。

    ExternalContext externalContext = facesContext.getExternalContext();
    InputStream in = externalContext.getResourceAsStream("/WEB-INF/config.xml");

実行時にこのファイルを編集したいのですが、ファイルを上書きする方法がわかりません。絶対パスへのFileOutputStreamを作成するよりも良い方法はありますか?また、そうでない場合でも、ファイルの絶対パス(WEB-INFフォルダーへの絶対パス)を取得する方法が必要です。

4

1 に答える 1

2

具体的な質問については、次のようにファイルへの絶対パスを取得できます。

ExternalContext externalContext = facesContext.getExternalContext();
String realPath = externalContext.getRealPath("/WEB-INF/config.xml");
FileOutputStream output = new FileOutputStream(realPath);
// ...

ただし、具体的な機能要件に関しては、2つの大きな問題が考えられます。

  1. getRealPath()nullコンテナがディスクではなくメモリ内のWARファイルを拡張するように構成されている場合に戻ります。その場合、物理ディスクファイルシステムパスの手段はありません。メモリ内の場所への「ファイルパス」を取得する方法はありません。

  2. 有効なパスが返された場合でも、ローカルディスクファイルシステムの拡張WAR構造に加えられたすべての変更は、WARを再デプロイするたびに、または一部のサーバー構成でもサーバーを再起動したときに失われます。単純な理由は、これらの変更が元のWARファイルに含まれていないことです。基本的に、WARを抽出し、そこで変更を加え、WARを再度パックして、サーバーの再デプロイをトリガーする必要があります。これは実行時に意味がありません。

言い換えれば、あなたは間違った方向の解決策を探しています。固定のローカルディスクファイルシステムパスを準備し、代わりに読み取り/書き込みを行う必要があります。別の方法は、代わりにSQLデータベースを使用することjava.util.prefs.preferencesです。

参照:

于 2013-01-25T13:25:19.507 に答える