我正在尝试从我的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
。这是怎么造成的,我该如何解决?
答案 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") );
这是关于该主题的好博客
答案 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 ...
三个原因: