从另一个JAR文件解压缩/解压缩资源

时间:2013-11-08 12:36:08

标签: java jar resources

我有两个jar文件。通常,如果我想从我的jar文件中“解压缩”资源,我会去:

    InputStream in = MyClass.class.getClassLoader().getResourceAsStream(name);
    byte[] buffer = new byte[1024];
    int read = -1;
    File temp2 = new File(new File(System.getProperty("user.dir")), name);
    FileOutputStream fos2 = new FileOutputStream(temp2);

    while((read = in.read(buffer)) != -1) {
        fos2.write(buffer, 0, read);
    }
    fos2.close();
    in.close();

如果我在同一目录中有另一个JAR文件怎么办?我可以用simillar方式访问第二个JAR文件资源吗?第二个JAR没有运行,所以没有自己的类加载器。是解压缩第二个JAR文件的唯一方法吗?

3 个答案:

答案 0 :(得分:2)

我使用下面提到的代码来执行相同类型的操作。它使用JarFile类来做同样的事情。

      /**
   * Copies a directory from a jar file to an external directory.
   */
  public static void copyResourcesToDirectory(JarFile fromJar, String jarDir, String destDir)
      throws IOException {
    for (Enumeration<JarEntry> entries = fromJar.entries(); entries.hasMoreElements();) {
      JarEntry entry = entries.nextElement();
      if (entry.getName().startsWith(jarDir + "/") && !entry.isDirectory()) {
        File dest = new File(destDir + "/" + entry.getName().substring(jarDir.length() + 1));
        File parent = dest.getParentFile();
        if (parent != null) {
          parent.mkdirs();
        }

        FileOutputStream out = new FileOutputStream(dest);
        InputStream in = fromJar.getInputStream(entry);

        try {
          byte[] buffer = new byte[8 * 1024];

          int s = 0;
          while ((s = in.read(buffer)) > 0) {
            out.write(buffer, 0, s);
          }
        } catch (IOException e) {
          throw new IOException("Could not copy asset from jar file", e);
        } finally {
          try {
            in.close();
          } catch (IOException ignored) {}
          try {
            out.close();
          } catch (IOException ignored) {}
        }
      }
    }

答案 1 :(得分:1)

如果另一个Jar在您的常规类路径中,那么您可以以完全相同的方式访问该jar中的资源。如果Jar只是一个不在类路径上的文件,则必须打开它并使用the JarFile and related classes提取文件。请注意,Jar文件只是特殊类型的Zip文件,因此您还可以使用ZipFile related classes

访问Jar文件

答案 2 :(得分:1)

您可以使用URLClassLoader

URLClassLoader classLoader = new URLClassLoader(new URL[]{new URL("path_to_file//myjar.jar")})
classLoader.loadClass("MyClass");//is requared
InputStream stream = classLoader.getResourceAsStream("myresource.properties");