【问题标题】:Access file in jar file?访问jar文件中的文件?
【发布时间】:2011-07-07 12:23:09
【问题描述】:

我需要能够访问存储在已编译 jar 文件中的文件。我已经想出了如何将文件添加到项目中,但我将如何在代码中引用它?如何将文件从 jar 文件复制到用户硬盘上的某个位置?我知道有几十种方法可以访问文件(FileInputStream、FileReader 等),但我不知道如何查看其内部。

【问题讨论】:

    标签: java file jar


    【解决方案1】:

    你可以这样使用:

    InputStream is = this.getClass().getClassLoader().getResourceAsStream(fileFromJarFile);

    如果 foo.txt 在您的 JAR 文件的根目录中,您将使用:

    InputStream is = this.getClass().getClassLoader().getResourceAsStream("foo.txt");

    假设该类与资源在同一个 JAR 文件中,我相信。

    【讨论】:

    • 我需要的部分是 BufferedReader,它需要一个 FileReader 作为输入。如何将 InputStream 转换为 FileReader?
    • 您只需将这些点与 Java 文档联系起来。查看 BufferedReader - 在另请参阅部分,有 FileReader 和 InputStreamReader。转到InputStreamReader等
    • 是的,我可以这样做,但我只是查找了 BufferedReader,并找到了我需要使用的 parter 类 BufferInputStream:P。
    • 有趣:... getResourceAsStream("foo.txt");对我不起作用,而是 getResourceAsStream("/foo.txt");
    【解决方案2】:

    您可以使用getResource() 来获取类路径中文件的URL,或者使用getResourceAsStream() 来获取InputStream。

    例如:

    BufferedReader reader = new BufferedReader(new InputStreamReader(
        this.getClass().getResourceAsStream("foo.txt")));
    

    【讨论】:

      【解决方案3】:

      您可以使用 JarFile 类读取 JAR 文件的内容。

      这是一个示例,说明如何从 JAR 文件中获取特定文件并将其解压缩:

      JarFile jar = new JarFile("foo.jar");
      String file = "file.txt";
      JarEntry entry = jar.getEntry(file);
      InputStream input = jar.getInputStream(entry);
      OutputStream output = new FileOutputStream(file);
      try {
          byte[] buffer = new byte[input.available()];
          for (int i = 0; i != -1; i = input.read(buffer)) {
              output.write(buffer, 0, i);
          }
      } finally {
          jar.close();
          input.close();
          output.close();
      }
      

      【讨论】:

      • 我认为OP的意思是编译后的jar中的文件
      • @Sam1370:是的。不是这样吗?
      【解决方案4】:

      只是想补充一点,如果我们想访问位于以下路径的 Jar 中的文件:

      Windows:  
      c:\your-jar-file.jar\dir1\dir2\dir3\foo.txt
      
      Linux: 
      /home/your-jar-file.jar/dir1/dir2/dir3/foo.txt
      

      需要使用以下代码(注意路径开头有NO“/”(正斜杠)字符):

      InputStream is = this.getClass().getClassLoader().getResourceAsStream("dir1/dir2/dir3/foo.txt");
      

      【讨论】:

      • getResourceAsStream 如何知道查看 c:\your-jar-file.jar 内部?如果 jar 文件与运行程序的 jar 文件完全分开怎么办?
      【解决方案5】:

      查看 JarFile 类。获取 jar 文件中特定条目的 InputStream 所需的一切都在那里。

      【讨论】:

        猜你喜欢
        • 2012-01-05
        • 1970-01-01
        • 1970-01-01
        • 2013-12-13
        • 2015-09-19
        • 1970-01-01
        • 2011-08-12
        • 1970-01-01
        • 2011-11-14
        相关资源
        最近更新 更多