簡體   English   中英

如何使用Java解壓縮包含不同文件格式的zip文件夾

[英]How to unzip a zip folder containing different file formats using Java

我需要解壓縮包含不同文件格式(如.txt, .xml, .xls等)的壓縮目錄。

如果目錄僅包含.txt files但我無法解壓縮,但使用其他文件格式失敗。 下面是我正在使用的程序,經過一番谷歌搜索之后,我看到的都是類似的方法-

import java.io.*;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

public class ZipUtils {
  public static void extractFile(InputStream inStream, OutputStream outStream) throws IOException {
      byte[] buf = new byte[1024];
      int l;
      while ((l = inStream.read(buf)) >= 0) {
           outStream.write(buf, 0, l);
      }
      inStream.close();
      outStream.close();
  }

  public static void main(String[] args) {
      Enumeration enumEntries;
      ZipFile zip;

      try {
          zip = new ZipFile("myzip.zip");
          enumEntries = zip.entries();
          while (enumEntries.hasMoreElements()) {
              ZipEntry zipentry = (ZipEntry) enumEntries.nextElement();
              if (zipentry.isDirectory()) {
                  System.out.println("Name of Extract directory : " + zipentry.getName());
                  (new File(zipentry.getName())).mkdir();
                  continue;
              }
              System.out.println("Name of Extract fille : " + zipentry.getName());

              extractFile(zip.getInputStream(zipentry), new FileOutputStream(zipentry.getName()));
          }
          zip.close();
     } catch (IOException ioe) {
         System.out.println("There is an IoException Occured :" + ioe);
         ioe.printStackTrace();
     }
  }
}

引發以下異常-

There is an IoException Occured :java.io.FileNotFoundException: myzip\abc.xml (The system cannot find the path specified)
java.io.FileNotFoundException: myzip\abc.xml (The system cannot find the path specified)
    at java.io.FileOutputStream.open(Native Method)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:212)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:104)
    at updaterunresults.ZipUtils.main(ZipUtils.java:43)

當您嘗試打開將包含提取的內容的文件時,會發生錯誤。 這是因為myzip文件夾不可用。

因此,請檢查它是否確實不可用並在解壓縮zip之前創建它:

File outputDirectory = new File("myzip");
if(!outputDirectory.exists()){
    outputDirectory.mkdir();
}

正如@ Perception在評論中指出的那樣:輸出位置是相對於active / working目錄的。 這可能不太方便,因此您可能需要將提取位置添加到提取文件的位置:

File outputLocation = new File(outputDirectory, zipentry.getName());
extractFile(zip.getInputStream(zipentry), new FileOutputStream(outputLocation));

(當然,您還需要將outputLocation添加到目錄創建代碼中)

這是一個很好的例子 ,他展示了將所有格式(pdf,txt等)解壓縮的樣子

或者您可以使用此代碼可能有效(我沒有嘗試過)

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public class ZipUtils
{
  private static final int  BUFFER_SIZE = 4096;

  private static void extractFile(ZipInputStream in, File outdir, String name) throws IOException
  {
    byte[] buffer = new byte[BUFFER_SIZE];
    BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(new File(outdir,name)));
    int count = -1;
    while ((count = in.read(buffer)) != -1)
      out.write(buffer, 0, count);
    out.close();
  }

  private static void mkdirs(File outdir,String path)
  {
    File d = new File(outdir, path);
    if( !d.exists() )
      d.mkdirs();
  }

  private static String dirpart(String name)
  {
    int s = name.lastIndexOf( File.separatorChar );
    return s == -1 ? null : name.substring( 0, s );
  }

  /***
   * Extract zipfile to outdir with complete directory structure
   * @param zipfile Input .zip file
   * @param outdir Output directory
   */
  public static void extract(File zipfile, File outdir)
  {
    try
    {
      ZipInputStream zin = new ZipInputStream(new FileInputStream(zipfile));
      ZipEntry entry;
      String name, dir;
      while ((entry = zin.getNextEntry()) != null)
      {
        name = entry.getName();
        if( entry.isDirectory() )
        {
          mkdirs(outdir,name);
          continue;
        }
        /* this part is necessary because file entry can come before
         * directory entry where is file located
         * i.e.:
         *   /foo/foo.txt
         *   /foo/
         */
        dir = dirpart(name);
        if( dir != null )
          mkdirs(outdir,dir);

        extractFile(zin, outdir, name);
      }
      zin.close();
    } 
    catch (IOException e)
    {
      e.printStackTrace();
    }
  }
}

問候

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM