zip并在java中解压缩

我知道这是一个简单的任务,但在更改我的代码后它停止工作,我无法取回它! 我使用两个函数来压缩和解压缩,即使它实际上做的是“jar”和“unjar”,但这不应该产生巨大的差异

public static void zipit(File[] infiles, JarOutputStream jos) throws Exception { zipit(infiles,"", jos); } public static void zipit(File[] infiles, String root, JarOutputStream jos) throws Exception { byte[] buffer = new byte[4096]; for(int i=0; i<infiles.length; i++) { // recursive call for subfolders... temporary if(infiles[i].isDirectory()) { zipit(infiles[i].listFiles(), infiles[i].getName() + "/", jos); continue; } // create string with absolute path String entryfile = root + infiles[i].getName(); JarEntry entry = new JarEntry(entryfile); zos.putNextEntry(entry); FileInputStream fis = new FileInputStream(infiles[i]); int count; while((count = fis.read(buffer, 0, buffer.length)) != -1) zos.write(buffer, 0, count); } } public static void unzipit(File zipfile, File outputfolder) throws Exception { JarFile jar = new JarFile(zipfile); for(Enumeration entries = jar.entries(); entries.hasMoreElements(); ) { JarEntry entry = (JarEntry) entries.nextElement(); File unzipped = new File(outputfolder, entry.getName()); if (entry.isDirectory() && !unzipped.exists()) { unzipped.mkdirs(); continue; } else if (!unzipped.getParentFile().exists()) unzipped.getParentFile().mkdirs(); FileOutputStream fos = new FileOutputStream(unzipped); InputStream in = jar.getInputStream(entry); byte[] buffer = new byte[4096]; int count; while((count = in.read(buffer, 0, buffer.length)) != -1) fos.write(buffer, 0, count); fos.close(); } } 

任何帮助/建议?

创建JarFile时发生错误:

 java.util.zip.ZipException: error in opening zip file at java.util.zip.ZipFile.open(Native Method) at java.util.zip.ZipFile.(ZipFile.java:131) at java.util.jar.JarFile.(JarFile.java:150) at java.util.jar.JarFile.(JarFile.java:114) 

我不知道这是不是你的问题,但通常很好的做法是在完成写作后关闭每个zip条目。

请参见ZipOutputStream.closeEntry()

在您显示的代码中,zip中的最后一个条目不会被关闭。 您也不会显示关闭JarOutputStream本身的位置。 这可能会导致您创建无效的zip文件,这些文件在使用您的其他方法回读时会出错。

不知何故,我得到它的工作,显然它与流相关…感谢大家的帮助!

 class zipper { static byte[] buffer = new byte[4096]; public static void unzip(File zipfile, File outputfolder) throws Exception { JarFile zip = new JarFile(zipfile); Enumeration entries = zip.entries(); while(entries.hasMoreElements()) { JarEntry entry = (JarEntry) entries.nextElement(); File unzipped = new File(outputfolder,entry.getName()); if (entry.isDirectory() && !unzipped.exists()) { unzipped.mkdirs(); continue; } else if (!unzipped.getParentFile().exists()) unzipped.getParentFile().mkdirs(); InputStream in = zip.getInputStream(entry); FileOutputStream fos = new FileOutputStream(unzipped); int count; while((count = in.read(buffer, 0, buffer.length)) != -1) fos.write(buffer, 0, count); // clean up fos.close(); in.close(); } } public static void zip(File[] infiles, JarOutputStream jos) throws Exception { zip(infiles,"",jos); // clean up jos.flush(); jos.close(); } public static void zip(File[] infiles, String basefolder, JarOutputStream jos) throws Exception { for(int i=0; i