在war存档中读取文本文件

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

+ war archive> + 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 。 我也尝试使用以下代码行来获取文件,但是没有成功

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

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

试试以下:

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

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

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

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

我更喜欢这种方法:

 InputStream inputStream = getClass().getResourceAsStream("/resources/email/file.txt"); if (inputStream != null) { try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) { ... } catch ... } else ... 

三个原因:

  • 它支持两种:从绝对路径和相对路径(从给定类开始)加载资源 – 另请参阅此答案
  • 获得流的方式要短一步
  • 它利用try-with-resources语句隐式关闭底层输入流