读取战争档案中的文本文件[重复]

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.(Unknown Source) [rt.jar:1.7.0_04] at java.io.InputStreamReader.(Unknown来源)[rt.jar:1.7.0_04] at org.xanosms.emailsender.RegistrationEmailLoader.loadFile(RegistrationEmailLoader.java:43) [classes:] 抱歉,我发现省略 .txt 扩展名可以解决问题。非常感谢你的帮助。我很感激!【参考方案2】:

试试下面:

   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:请看我的编辑

以上是关于读取战争档案中的文本文件[重复]的主要内容,如果未能解决你的问题,请参考以下文章

从Java中的图像文件中读取文本[重复]

有效地读取 R 中的一个非常大的文本文件 [重复]

读取存储在文本文件中的字典并转换为熊猫数据框[重复]

用javascript读取本地文本文件[重复]

C++ 和读取大型文本文件

如何在 Struts 2 应用程序中读取文本文件 [重复]