【问题标题】:Reading a text file from a jar从 jar 中读取文本文件
【发布时间】:2014-05-24 23:24:33
【问题描述】:

我无法从 jar 中读取文本文件。我在解压缩时对其进行了管理,但现在我已将其存档,它将无法正常工作。 罐子里有:

  • BTA.jar
    • Splash.class
    • *.class
    • Splash.txt
    • 等等..

现在,我正在使用 BufferedReader 和 FileReader

 f = new FileReader("Splash.txt");
 in = new BufferedReader(f);

但通过谷歌搜索,我知道这只从 jar 外部读取文件。

我的问题是:如何从 jar 中读取文件?

【问题讨论】:

  • 您是否在Spash 中运行main 方法?
  • 不,main 方法在一个名为 Main 的类中
  • "既然我已经存档了"

标签: java file text jar


【解决方案1】:

假设你正在执行BTA.jar,你可以使用

InputStream in = YourClass.class.getResourceAsStream("/Splash.txt");

检索InputStream 并通过InputStreamReader 将其传递给BufferedReader

传递给方法的路径格式规则在Class 类的javadoc 中定义here

【讨论】:

    【解决方案2】:

    问题是Splash.txt 不是一个文件,它在一个(轻度)压缩文件中的一系列字节,该文件在 Jar/Zip 标准指定的目录中有一个命名条目。

    这意味着您可以使用FileReader 来读取文件,相反,您需要通过Class 资源管理API 来访问它,例如..

    getClass().getResourceAsStream("/Splash.txt");
    

    或者,如果您尝试从 static 上下文中读取它

    Splash.class.getResourceAsStream("/Splash.txt");
    

    别忘了,你有责任在完成后关闭InputStream,例如...

    try (InputStream is = getClass().getResourceAsStream("/Splash.txt")) {....
    

    【讨论】:

      【解决方案3】:

      jar 只是一个 zip 文件,可以像这样读取..

      ZipFile file = new ZipFile("/home/Desktop/myjar.jar");
      Enumeration<? extends ZipEntry> entries = file.entries();
      
      while (entries.hasMoreElements()) {
          ZipEntry entry = entries.nextElement();
      
          if (entry.getName().startsWith("splash")) {
              try (BufferedReader reader = new BufferedReader(new InputStreamReader(file.getInputStream(entry)))) {
                  String line = null;
                  while ((line = reader.readLine()) != null) {
                      System.out.println(line);
                  }
              }
          }
      }
      

      【讨论】:

        最近更新 更多