您不能压缩文件夹,只能压缩文件。要压缩文件夹,必须手动添加所有子文件。我写了本课来完成这项工作。您可以免费获得它:)
用法是这样的:
List<File> sources = new ArrayList<File>();sources.add(tobackup);Packager.packZip(new File(zipName), sources);
这是课程:
import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.util.List;import java.util.zip.Deflater;import java.util.zip.ZipEntry;import java.util.zip.ZipOutputStream;public class Packager{ public static void packZip(File output, List<File> sources) throws IOException { System.out.println("Packaging to " + output.getName()); ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(output)); zipOut.setLevel(Deflater.DEFAULT_COMPRESSION); for (File source : sources) { if (source.isDirectory()) { zipDir(zipOut, "", source); } else { zipFile(zipOut, "", source); } } zipOut.flush(); zipOut.close(); System.out.println("Done"); } private static String buildPath(String path, String file) { if (path == null || path.isEmpty()) { return file; } else { return path + "/" + file; } } private static void zipDir(ZipOutputStream zos, String path, File dir) throws IOException { if (!dir.canRead()) { System.out.println("Cannot read " + dir.getCanonicalPath() + " (maybe because of permissions)"); return; } File[] files = dir.listFiles(); path = buildPath(path, dir.getName()); System.out.println("Adding Directory " + path); for (File source : files) { if (source.isDirectory()) { zipDir(zos, path, source); } else { zipFile(zos, path, source); } } System.out.println("Leaving Directory " + path); } private static void zipFile(ZipOutputStream zos, String path, File file) throws IOException { if (!file.canRead()) { System.out.println("Cannot read " + file.getCanonicalPath() + " (maybe because of permissions)"); return; } System.out.println("Compressing " + file.getName()); zos.putNextEntry(new ZipEntry(buildPath(path, file.getName()))); FileInputStream fis = new FileInputStream(file); byte[] buffer = new byte[4092]; int byteCount = 0; while ((byteCount = fis.read(buffer)) != -1) { zos.write(buffer, 0, byteCount); System.out.print('.'); System.out.flush(); } System.out.println(); fis.close(); zos.closeEntry(); }}请享用!
编辑 :要检查程序是否仍在忙,可以添加我用(*)标记的三行
编辑2 :尝试新的代码。在我的平台上,它运行正确(OS X)。我不确定,但是在Windows中,AppData中的文件可能会有一些有限的读取权限。



