我知道这是一项容易的任务,但是更改代码后它停止工作,并且无法恢复!我实际上使用了两个函数来进行压缩和解压缩,尽管实际上它是“ 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.<init>(ZipFile.java:131) at java.util.jar.JarFile.<init>(JarFile.java:150) at java.util.jar.JarFile.<init>(JarFile.java:114)
我不知道这是否是您的问题,但是通常最好在完成写入后关闭每个zip条目。
请参阅ZipOutputStream.closeEntry()。
ZipOutputStream.closeEntry()
在显示的代码中,不会关闭邮政编码中的最后一个条目。您也不会显示关闭JarOutputStream本身的位置。这可能会导致您创建无效的zip文件,而使用其他方法回读它们时会出现错误。