读取战争档案中的文本文件[重复]
Posted
技术标签:
【中文标题】读取战争档案中的文本文件[重复]【英文标题】:Reading a text file in war archive [duplicate] 【发布时间】:2012-10-25 22:03:16 【问题描述】:我正在尝试从我的战争档案中读取一个文本文件,并在运行时在 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
但问题是,当我运行上述代码的方法时,会抛出 A FileNotFoundException
。我也试过用下面这行代码来获取文件,但一直没有成功
File file = new File(FacesContext.getCurrentInstance()
.getExternalContext().getRequestContextPath() + "/resources/email/file.txt");
我仍然收到FileNotFoundException
。这是如何引起的,我该如何解决?
【问题讨论】:
【参考方案1】:尽量避免使用文件,因为这是为了从文件系统中读取内容。
由于您的资源被捆绑到 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/
【讨论】:
谢谢。一天一个问题就够了。 我已经尝试过上面的示例,我在以下目录结构/WEBINF/classes/resources/file.txt 中列出了该文件。但是我仍然收到以下异常原因:java.io.Reader.试试下面:
InputStream inputStream =
getClass().getClassLoader().getResourceAsStream("/resources/email/file.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream ));
【讨论】:
这对我有用,但文件路径中没有“/resources”前缀【参考方案3】:如果你想获取java File对象,你可以试试这个:
String path = Thread.currentThread().getContextClassLoader().getResource("language/file.xml").getPath();
File f = new File(path);
System.out.println(f.getAbsolutePath());
【讨论】:
【参考方案4】:我更喜欢这种方法:
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 语句隐式关闭底层输入流【讨论】:
与 9 票赞成的公认答案相比,这里有什么不同......? @Kukeltje:请看我的编辑以上是关于读取战争档案中的文本文件[重复]的主要内容,如果未能解决你的问题,请参考以下文章