如何在Java中以ZIP格式压缩文件

x33g5p2x  于2022-10-06 转载在 Java  
字(3.5k)|赞(0)|评价(0)|浏览(342)

1. 概述

在这篇文章中,我们将向你展示如何将单个文件压缩成zip和多个文件压缩成zip格式。本文的例子使用try-with-resources语句来自动关闭资源,并在jdk 8及以后的版本中编译和执行。

Java自带的 "java.util.zip "库可以以ZIp格式进行数据压缩。

2. 以ZIP格式压缩单个文件示例

  1. 用 "FileInputStream "读取文件
FileInputStream in = new FileInputStream("C:/Project_Work/samples/sample.txt");
  1. 用 "FileOutputStream "创建输出压缩文件
FileOutputStream fos = new FileOutputStream("C:/Project_Work/samples/src_sample.zip")
  1. 在 "ZipEntry "中添加文件名,并将其输出到 "ZipOutputStream"。
    读取文件 "C:/Project_Work/samples/sample.txt "并将其压缩成一个压缩文件--"C:/Project_Work/samples/src_sample.zip"。
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
* This Java program demonstrates how to compress single file in ZIP format.
* @author javaguides.net
*/

public class CompressZipFile {
 public static void main(String[] args) {

  try (FileOutputStream fos = new FileOutputStream("C:/Project_Work/samples/src_sample.zip");
    ZipOutputStream zos = new ZipOutputStream(fos);
    FileInputStream in = new FileInputStream("C:/Project_Work/samples/sample.txt");) {
   ZipEntry ze= new ZipEntry("sample.txt");
      zos.putNextEntry(ze);
   byte[] buffer = new byte[1024];
   int len;
   while ((len = in.read(buffer)) > 0) {
    zos.write(buffer, 0, len);
   }

  } catch (IOException e) {
   e.printStackTrace();
  }
 }
}

3. 以ZIP格式压缩多个文件 示例

读取文件夹 "C:\Project_Work\samples_src_sample "中的所有文件,并将其压缩成一个压缩文件--"C:\Project_Work\samples\dest_sample.zip"。它也会递归地压缩一个目录。

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
* This Java program demonstrates how to compress multiple files in ZIP format.
* 
* @author javaguides.net
*
*/
public class CompressMultipleFilesToZip {
 List<String> fileList;
 private static final String OUTPUT_ZIP_FILE = "C:\\Project_Work\\samples\\dest_sample.zip";
 private static final String SOURCE_FOLDER = "C:\\Project_Work\\samples\\src_sample";

 CompressMultipleFilesToZip() {
  fileList = new ArrayList<String>();
 }

 public static void main(String[] args) {
  CompressMultipleFilesToZip appZip = new CompressMultipleFilesToZip();
  appZip.generateFileList(new File(SOURCE_FOLDER));
  appZip.zipIt(OUTPUT_ZIP_FILE);
 }

 /**
* Zip it
* 
* @param zipFile
*            output ZIP file location
*/
 public void zipIt(String zipFile) {

  byte[] buffer = new byte[1024];

  try (FileOutputStream fos = new FileOutputStream(zipFile); ZipOutputStream zos = new ZipOutputStream(fos);) {
   System.out.println("Output to Zip : " + zipFile);

   for (String file : this.fileList) {

    System.out.println("File Added : " + file);
    ZipEntry ze = new ZipEntry(file);
    zos.putNextEntry(ze);

    try (FileInputStream in = new FileInputStream(SOURCE_FOLDER + File.separator + file);) {
     int len;
     while ((len = in.read(buffer)) > 0) {
      zos.write(buffer, 0, len);
     }
    }
   }
   System.out.println("Done");
  } catch (IOException e) {
   e.printStackTrace();
  }
 }

 /**
* Traverse a directory and get all files, and add the file into fileList
* 
* @param node
*            file or directory
*/
 public void generateFileList(File node) {

  // add file only
  if (node.isFile()) {
   fileList.add(generateZipEntry(node.getAbsoluteFile().toString()));
  }

  if (node.isDirectory()) {
   String[] subNote = node.list();
   for (String filename : subNote) {
    generateFileList(new File(node, filename));
   }
  }

 }

 /**
* Format the file path for zip
* 
* @param file
*            file path
* @return Formatted file path
*/
 private String generateZipEntry(String file) {
  return file.substring(SOURCE_FOLDER.length() + 1, file.length());
 }
}

输出:

Output to Zip : C:\Project_Work\samples\dest_sample.zip
File Added : sample.txt
File Added : sample1.txt
File Added : sample2.txt
Done

相关文章

微信公众号

最新文章

更多