如何用Java解压缩文件

时间:2020-01-09 10:35:31  来源:igfitidea点击:

在Java中压缩文件时,根据是压缩文件还是在Java中压缩文件夹(其中整个目录结构都已存档),会有不同的逻辑。但是用Java解压缩文件并不需要这些不同的功能。一个用于解压缩文件的Java程序负责所有不同的功能。

解压缩文件-Java程序

要解压缩文件,我们需要执行以下步骤:

  • 从压缩存档中读取压缩文件。为此,使用了java.util.zip.ZipInputStream类。
  • 从ZipInputStream中,使用getNextEntry()方法读取文件和目录的zip条目。
  • 如果该条目用于目录,则只需创建目录。如果该条目是针对文件的,则读取文件的内容并将其写入目标文件。
  • 使用closeEntry()方法关闭当前条目。
  • 迭代完所有zip条目后,关闭输入和输出流。
public class UnzipFile {
  private static final int BUFFER = 2048;
  public static void main(String[] args) {
    final String SOURCE_ZIPDIR = "F:/theitroad/Parent.zip";
    // creating the destination dir using the zip file path
    // by truncating the ".zip" part
    String DESTINATION_DIR = SOURCE_ZIPDIR.substring(0, SOURCE_ZIPDIR.lastIndexOf('.'));
    //System.out.println("" + DESTINATION_DIR);
    extract(SOURCE_ZIPDIR, DESTINATION_DIR);
  }
	
  private static void extract(String source, String dest){
    try {
      File root = new File(dest);
      if(!root.exists()){
        root.mkdir();
      }
      BufferedOutputStream bos = null;
      // zipped input
      FileInputStream fis = new FileInputStream(source);
      ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis));
      ZipEntry entry;
      while((entry = zis.getNextEntry()) != null) {
        String fileName = entry.getName();
        File file = new File(dest + File.separator + fileName);
        if (!entry.isDirectory()) {
          extractFileContentFromArchive(file, zis);
        }
        else{
          if(!file.exists()){
            file.mkdirs();
          }
        }
        zis.closeEntry();
      }
      zis.close();
    } catch(Exception e) {
      e.printStackTrace();
    }
  }
	
  private static void extractFileContentFromArchive(File file, ZipInputStream zis) throws IOException{
    FileOutputStream fos = new FileOutputStream(file);
    BufferedOutputStream bos = new BufferedOutputStream(fos, BUFFER);
    int len = 0;
    byte data[] = new byte[BUFFER];
    while ((len = zis.read(data, 0, BUFFER)) != -1) {
      bos.write(data, 0, len);
    }
    bos.flush();
    bos.close();
  }
}