我创建了一个JAR文件.现在,我创建了另一个Java程序.我想在其他目录中解压缩该JAR文件,这意味着我想做一些像解压缩这样的事情.
如果我运行jar -xf filename.jar这会导致一些错误:
Exception in thread "main" java.io.IOException: Cannot run program "jar":
java.io.IOException: error=2, No such file or directory
at java.lang.ProcessBuilder.start(ProcessBuilder.java:459)
at java.lang.Runtime.exec(Runtime.java:593)`
Run Code Online (Sandbox Code Playgroud)
Jua*_*nZe 61
调整此示例:如何从JAR和zip存档中提取Java资源
或者试试这段代码:
以编程方式提取ZIP/JAR文件的内容
假设
jarFile是要提取的jar/zip文件.destDir是它将被提取的路径:Run Code Online (Sandbox Code Playgroud)java.util.jar.JarFile jar = new java.util.jar.JarFile(jarFile); java.util.Enumeration enumEntries = jar.entries(); while (enumEntries.hasMoreElements()) { java.util.jar.JarEntry file = (java.util.jar.JarEntry) enumEntries.nextElement(); java.io.File f = new java.io.File(destDir + java.io.File.separator + file.getName()); if (file.isDirectory()) { // if its a directory, create it f.mkdir(); continue; } java.io.InputStream is = jar.getInputStream(file); // get the input stream java.io.FileOutputStream fos = new java.io.FileOutputStream(f); while (is.available() > 0) { // write contents of 'is' to 'fos' fos.write(is.read()); } fos.close(); is.close(); } jar.close();
资料来源:http://www.devx.com/tips/Tip/22124
您可以使用此代码段作为参考来完成任务.它与@JuanZe上面显示的代码段几乎相同,只是对于那些获得FileNotFoundException的人,我添加了一个小代码片段来检查是否文件确实存在,如果没有,那么它将与文件一起创建父文件夹,并将提取指定目标文件夹内的jar文件的内容.
代码段:
public class JarDemo {
public static void main(String[] args) throws java.io.IOException {
java.util.jar.JarFile jarfile = new java.util.jar.JarFile(new java.io.File("E:/sqljdbc4.jar")); //jar file path(here sqljdbc4.jar)
java.util.Enumeration<java.util.jar.JarEntry> enu= jarfile.entries();
while(enu.hasMoreElements())
{
String destdir = "E:/abc/"; //abc is my destination directory
java.util.jar.JarEntry je = enu.nextElement();
System.out.println(je.getName());
java.io.File fl = new java.io.File(destdir, je.getName());
if(!fl.exists())
{
fl.getParentFile().mkdirs();
fl = new java.io.File(destdir, je.getName());
}
if(je.isDirectory())
{
continue;
}
java.io.InputStream is = jarfile.getInputStream(je);
java.io.FileOutputStream fo = new java.io.FileOutputStream(fl);
while(is.available()>0)
{
fo.write(is.read());
}
fo.close();
is.close();
}
}
}
Run Code Online (Sandbox Code Playgroud)
JarFile类.
JarFile file = new JarFile("file.jar");
for (Enumeration<JarEntry> enum = file.entries(); enum.hasMoreElements();) {
JarEntry entry = enum.next();
System.out.println(entry.getName());
}
Run Code Online (Sandbox Code Playgroud)
老问题。
这是使用的更新答案:
java.nio高效创建和复制条目stream按字典顺序排序和收集条目(以便始终首先创建文件夹)。 请注意,我使用java.util.zip.ZipFile(基类)而不是java.util.jar.JarFile(子类)。
最后一个执行更多“仅”从存档中提取文件不需要的操作。
因此,它减少了开销并防止与安全问题相关的异常出现。但如果需要,您当然可以替换ZipFile/ZipEntry为JarFile/JarEntry.
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
public class FileUtils {
public static void extractArchive(Path archiveFile, Path destPath) throws IOException {
Files.createDirectories(destPath); // create dest path folder(s)
try (ZipFile archive = new ZipFile(archiveFile.toFile())) {
// sort entries by name to always create folders first
List<? extends ZipEntry> entries = archive.stream()
.sorted(Comparator.comparing(ZipEntry::getName))
.collect(Collectors.toList());
// copy each entry in the dest path
for (ZipEntry entry : entries) {
Path entryDest = destPath.resolve(entry.getName());
if (entry.isDirectory()) {
Files.createDirectory(entryDest);
continue;
}
Files.copy(archive.getInputStream(entry), entryDest);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)