13

戦争アーカイブからテキストファイルを読み取り、実行時にフェイスレットページにコンテンツを表示しようとしています。私のフォルダ構造は次のとおりです

+戦争アーカイブ>+リソース>+メール>+file.txt

次のコードを使用して、resources / email/file.txtフォルダー内のファイルを読み取ろうとします

File file = new File("/resources/email/file.txt");
BufferedReader reader = null;
try {
    reader = new BufferedReader(new FileReader(file));
} catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
StringBuffer buffer = new StringBuffer();
if (reader != null) {
    String line = reader.readLine();
    while (line != null) {
        buffer.append(line);
        line = reader.readLine();
// other lines of code

ただし、問題は、上記のコードを使用したメソッドを実行すると、AFileNotFoundExceptionがスローされることです。次のコード行を使用してファイルを取得しようとしましたが、成功しませんでした

File file = new File(FacesContext.getCurrentInstance()
        .getExternalContext().getRequestContextPath() + "/resources/email/file.txt");

私はまだ取得しFileNotFoundExceptionます。これはどのように発生し、どうすれば解決できますか?

4

4 に答える 4

27

以下を試してください:

   InputStream inputStream = 
      getClass().getClassLoader().getResourceAsStream("/resources/email/file.txt");
   BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream ));
于 2012-11-06T00:50:04.113 に答える
10

これはファイル システムから何かを読み取るためのものであるため、File は避けてください。

リソースは WAR にバンドルされているため、クラスローダーを介してアクセスできます。

リソースが WEB-INF/classes フォルダーにバンドルされていることを確認します。

InputStream in =
new InputStreamReader(FileLoader.class.getClassLoader().getResourceAsStream("/resources/email/file.txt") );

これはトピックに関する良いブログです

http://haveacafe.wordpress.com/2008/10/19/how-to-read-a-file-from-jar-and-war-files-java-and-webapp-archive/

于 2012-11-06T00:48:24.660 に答える
4

Java File オブジェクトを取得したい場合は、これを試すことができます。

String path = Thread.currentThread().getContextClassLoader().getResource("language/file.xml").getPath();
File f = new File(path);
System.out.println(f.getAbsolutePath());
于 2014-08-27T08:52:07.337 に答える
1

私はこのアプローチを好みます:

InputStream inputStream = getClass().getResourceAsStream("/resources/email/file.txt");

if (inputStream != null) {
    try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
       ...
    } catch ...
} else ...

3 つの理由:

  • 両方をサポートしています:絶対パスと相対パス(指定されたクラスから始まる)からのリソースのロード-この回答も参照してください
  • ストリームを取得する方法が 1 歩短くなります
  • try-with-resourcesステートメントを使用して、基になる入力ストリームを暗黙的に閉じます
于 2015-12-15T13:02:18.020 に答える