【问题标题】: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。这是如何引起的,我该如何解决?

【问题讨论】:

    标签: java jsf


    【解决方案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:请看我的编辑
      猜你喜欢
      • 2019-09-26
      • 2018-11-03
      • 1970-01-01
      • 1970-01-01
      • 2017-09-18
      • 1970-01-01
      • 1970-01-01
      • 2013-09-24
      • 2011-12-16
      相关资源
      最近更新 更多