Самый простой способ распаковать банку в java - PullRequest
3 голосов
/ 19 августа 2009

По сути, у меня есть файл jar, который я хочу распаковать в определенную папку из теста junit.

Какой самый простой способ сделать это? Я готов использовать бесплатную стороннюю библиотеку, если это необходимо.

Ответы [ 6 ]

6 голосов
/ 19 августа 2009

Вы можете использовать java.util.jar.JarFile для перебора записей в файле, извлечения каждой из них через InputStream и записи данных во внешний файл. Apache Commons IO предоставляет утилиты, чтобы сделать это немного менее неуклюжим.

4 голосов
/ 20 августа 2009
ZipInputStream in = null;
OutputStream out = null;

try {
    // Open the jar file
    String inFilename = "infile.jar";
    in = new ZipInputStream(new FileInputStream(inFilename));

    // Get the first entry
    ZipEntry entry = in.getNextEntry();

    // Open the output file
    String outFilename = "o";
    out = new FileOutputStream(outFilename);

    // Transfer bytes from the ZIP file to the output file
    byte[] buf = new byte[1024];
    int len;
    while ((len = in.read(buf)) > 0) {
        out.write(buf, 0, len);
    }
} catch (IOException e) {
    // Manage exception
} finally {
    // Close the streams
    if (out != null) {
        out.close();
    }

    if (in != null) {
        in.close();
    }
}
2 голосов
/ 19 августа 2009

Jar в основном архивируется с использованием ZIP-алгоритма, поэтому вы можете использовать winzip или winrar для извлечения.

Если вы ищете программный способ, тогда первый ответ будет более правильным.

1 голос
/ 20 августа 2009

Используйте задачу Ant unzip .

1 голос
/ 19 августа 2009

Из командной строки введите jar xf foo.jar или unzip foo.jar

0 голосов
/ 03 марта 2019

Вот моя версия на Scala, такая же на Java, которая распаковывается в отдельные файлы и каталоги:

import java.io.{BufferedInputStream, BufferedOutputStream, ByteArrayInputStream}
import java.io.{File, FileInputStream, FileOutputStream}
import java.util.jar._

def unpackJar(jar: File, target: File): Seq[File] = {
  val b   = Seq.newBuilder[File]
  val in  = new JarInputStream(new BufferedInputStream(new FileInputStream(jar)))

  try while ({
    val entry: JarEntry = in.getNextJarEntry
    (entry != null) && {
      val f = new File(target, entry.getName)
      if (entry.isDirectory) {
        f.mkdirs()
      } else {
        val bs  = new BufferedOutputStream(new FileOutputStream(f))
        try {
          val arr = new Array[Byte](1024)
          while ({
            val sz = in.read(arr, 0, 1024)
            (sz > 0) && { bs.write(arr, 0, sz); true }
          }) ()
        } finally {
          bs.close()
        }
      }
      b += f
      true
    }
  }) () finally {
    in.close()
  }

  b.result()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...