Java 工具类之解压/压缩文件

  • Post author:
  • Post category:java


有时候需要对文件或者文件夹进行压缩或者解压缩,在这里记录一下使用方式。

/**
 * 压缩文件
 *
 * @param zipFilePath 压缩的文件完整名称(目录+文件名)
 * @param srcPathName 需要被压缩的文件或文件夹
 * @author potoyang
 */
public static boolean compressFile(String zipFilePath, String srcPathName) {
	try (OutputStream fos = new FileOutputStream(zipFilePath);
		 OutputStream bos = new BufferedOutputStream(fos);
         ArchiveOutputStream aos = new ZipArchiveOutputStream(bos)) {

         Path dirPath = Paths.get(srcPathName);
         Files.walkFileTree(dirPath, new SimpleFileVisitor<Path>() {
         	@Override
            public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
            	ArchiveEntry entry = new ZipArchiveEntry(dir.toFile(), dirPath.relativize(dir).toString());
                aos.putArchiveEntry(entry);
                aos.closeArchiveEntry();
                return super.preVisitDirectory(dir, attrs);
            }

            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                ArchiveEntry entry = new ZipArchiveEntry(file.toFile(), dirPath.relativize(file).toString());
                aos.putArchiveEntry(entry);
                IOUtils.copy(new FileInputStream(file.toFile()), aos);
                aos.closeArchiveEntry();
                return super.visitFile(file, attrs);
            }

        });
        return true;
    } catch (IOException e) {
        e.printStackTrace();
        return false;
    }
}
/**
 * 解压文件
 *
 * @param zipFileName 解压文件路径
 * @param destDir     解压文件目录
 * @author potoyang
 */
public static void unZipFile(String zipFileName, String destDir) {
	try (InputStream fis = Files.newInputStream(Paths.get(zipFileName));
	     InputStream bis = new BufferedInputStream(fis);
         ArchiveInputStream ais = new ZipArchiveInputStream(bis)) {

         ArchiveEntry entry;
         while (Objects.nonNull(entry = ais.getNextEntry())) {
         	if (!ais.canReadEntryData(entry)) {
            	continue;
            }

            String name = destDir + File.separator + entry.getName();
            File f = new File(name);
            if (entry.isDirectory()) {
                if (!f.isDirectory() && !f.mkdirs()) {
                    f.mkdirs();
                }
            } else {
                File parent = f.getParentFile();
                if (!parent.isDirectory() && !parent.mkdirs()) {
                    throw new IOException("failed to create directory " + parent);
                }
                try (OutputStream o = Files.newOutputStream(f.toPath())) {
                    IOUtils.copy(ais, o);
                }
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}



版权声明:本文为qq_21842575原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。