在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") );
这是一个关于这个主题的好博客
如果你想获得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语句隐式关闭底层输入流