0

.txt, .xml, .xlsなどの異なるファイル形式を含むzip形式のディレクトリを解凍する必要があります。

ディレクトリにのみ.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)
4

2 に答える 2

3

抽出されたコンテンツを含むファイルを開こうとすると、エラーが発生します。これは、myzipフォルダが使用できないためです。

したがって、zipを解凍する前に、実際に使用できないかどうかを確認して作成してください。

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

@ Perceptionがコメントで指摘したように、出力場所はアクティブ/作業ディレクトリを基準にしています。これはおそらくあまり便利ではないので、抽出場所を抽出ファイルの場所に追加することをお勧めします。

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

outputLocation(もちろん、ディレクトリ作成コードにも追加する必要があります)

于 2013-02-28T12:12:06.893 に答える
2

これは、彼がすべての形式(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();
    }
  }
}

よろしく

于 2013-02-28T12:09:14.550 に答える