13

我正在尝试从我的战争档案中读取一个文本文件,并在运行时在 facelets 页面中显示内容。我的文件夹结构如下

+war 存档 > +resources > +email > +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

然而问题是,当我运行上述代码的方法时,FileNotFoundException会抛出A。我也试过用下面这行代码来获取文件,但一直没有成功

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

尽量避免使用文件,因为这是为了从文件系统中读取内容。

由于您的资源被捆绑到 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 ...

三个原因:

  • 它同时支持:从绝对路径和相对路径(从给定的类开始)加载资源 - 另请参阅此答案
  • 获取流的方式短了一步
  • 它利用try-with-resources语句隐式关闭底层输入流
于 2015-12-15T13:02:18.020 回答