在war存档中读取文本文件

时间:2012-11-06 00:44:22

标签: java jsf

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

+ war archive> +资源> +电子邮件> + 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

但问题是,当我运行上述代码的方法时,抛出A FileNotFoundException。我也尝试使用以下代码行来获取文件,但是还没有成功

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

我仍然得到FileNotFoundException。这是怎么造成的,我该如何解决?

4 个答案:

答案 0 :(得分:22)

尝试以下:

   InputStream inputStream = 
      getClass().getClassLoader().getResourceAsStream("/resources/email/file.txt");
   BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream ));

答案 1 :(得分:9)

尽量避免使用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/

答案 2 :(得分:3)

如果你想获得java File对象,可以试试这个:

String path = Thread.currentThread().getContextClassLoader().getResource("language/file.xml").getPath();
File f = new File(path);
System.out.println(f.getAbsolutePath());

答案 3 :(得分:1)

我更喜欢这种方法:

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

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

三个原因:

  • 它同时支持:从绝对路径和相对路径(从给定类开始)加载资源 - 另请参阅this answer
  • 获取流的方式简化了一步
  • 它利用 try-with-resources 语句隐式关闭基础输入流