Heim  >  Artikel  >  Java  >  Fallstudie zum Dekomprimieren und Komprimieren von Ordnern in Java

Fallstudie zum Dekomprimieren und Komprimieren von Ordnern in Java

黄舟
黄舟Original
2017-10-16 10:09:411580Durchsuche

In diesem Artikel werden hauptsächlich relevante Informationen zur Java-Dekomprimierung und zu Beispielen für komprimierte Ordner vorgestellt. Ich hoffe, dass dieser Artikel jedem helfen kann, solche Funktionen zu realisieren und solche Methoden zu beherrschen.

Ausführlich Beispiele für Java-Dekomprimierung und komprimierte Ordner

Hinweis: JDK7 unterstützt das Festlegen der Kodierungseinstellung Kodierungsformat zipFile, zipInputStream, zipOutputStream haben Kodierungsformate hinzugefügt, wenn jdk1.6 andere Paketunterstützung benötigt

Das Folgende ist der Code für den integrierten jdk-komprimierten Ordner:


public void dozip(String srcfile, String zipfile) throws IOException {
  String temp = "";
  File src = new File(srcfile);
  File zipFile=new File(zipfile);
  //判断要压缩的文件存不存在
  if (!src.exists()) {
    System.err.println("要压缩的文件不存在!");
    System.exit(1);
  }
  //如果说压缩路径不存在,则创建
  if (!zipFile.getParentFile().exists()) {
    zipFile.getParentFile().mkdirs();
//   System.out.println("创建ok");
  }
  // 封装压缩的路径
  BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(zipfile));
  //这里可以加入校验
//CheckedOutputStream cos = new CheckedOutputStream(bos,new CRC32());  
  //还可以设置压缩格式,默认UTF-8
  Charset charset = Charset.forName("GBK"); 
  ZipOutputStream zos = new ZipOutputStream(bos,charset);
  zip(src, zos, temp);
  //关闭流
  zos.flush();
  zos.close();
  System.out.println("压缩完成!");
  System.out.println("压缩文件的位置是:" + zipfile);
// System.out.println("检验和:"+cos.getChecksum().getValue());
  }

 private void zip(File file, ZipOutputStream zos, String temp)
    throws IOException {
  // 如果不加"/"将会作为文件处理,空文件夹不需要读写操作
  if (file.isDirectory()) {
    String str = temp + file.getName() + "/";
    zos.putNextEntry(new ZipEntry(str));
    File[] files = file.listFiles();
    for (File file2 : files) {
    zip(file2, zos, str);
    }
  } else {
    // System.out.println("当前文件的父路径:"+temp);
    ZipFile(file, zos, temp);
  }
  }

  private void ZipFile(File srcfile, ZipOutputStream zos, String temp)
    throws IOException {
  // 默认的等级压缩-1
  // zos.setLevel(xxx);
  // 封装待压缩文件
  BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
    srcfile));
  zos.putNextEntry(new ZipEntry(temp + srcfile.getName()));

  byte buf[] = new byte[1024];
  int len;
  while ((len = bis.read(buf)) != -1) {
    zos.write(buf, 0, len);
  }
  //按标准需要关闭当前条目,不写也行
  zos.closeEntry();
  bis.close();
  }

Das Folgende ist die Dekomprimierung:

Hier sind die Dekomprimierungsregeln für eine gute Komprimierung:

1. Wenn Sie in einen Ordner mit demselben Namen wie die komprimierte Datei dekomprimieren, dekomprimieren Sie sie direkt

Wenn Sie passen den anderen Ordner xxx an, erstellen zuerst xxx und legen ihn dann im dekomprimierten Ordner ab.

2 Beim Komprimieren wird das GBK-Format verwendet. Beim Dekomprimieren wird aus Gründen der Vereinheitlichung das GBK-Format verwendet wird verwendet. Da die RAR-Komprimierung patentiert ist (kommerzielle Software), ist der Dekomprimierungsalgorithmus vorhanden und die Standardkomprimierung erfolgt ebenfalls im GBK-Format. Wir haben festgestellt, dass unabhängig davon, ob UTF-8 oder GBK zur Komprimierung verwendet wird, GBK korrekt zur Dekomprimierung verwendet werden kann! (Der genaue Grund ist noch unklar)

Dieses Java-Programm wird direkt in den Ordner dekomprimiert. Standardmäßig wird es in denselben Pfad wie die komprimierte Datei dekomprimiert


Falls vorhanden ein Problem mit der Dekomprimierungskodierung, ein Fehler wird gemeldet: java.lang.IllegalArgumentException: MALFORMED


Wenn die komprimierte Datei ein Passwort hat: ein Fehler wird gemeldet: java.util.zip.ZipException: Verschlüsselter ZIP-Eintrag wird nicht unterstützt


Methode 2:

//方法1:
public void unZip(String zipfile) throws IOException {
  //检查是否是zip文件,并判断文件是否存在
  checkFileName(zipfile);
  long startTime = System.currentTimeMillis();
  File zfile=new File(zipfile);
  //获取待解压文件的父路径
  String Parent=zfile.getParent()+"/";
  FileInputStream fis=new FileInputStream(zfile);
  Charset charset = Charset.forName("GBK");//默认UTF-8
// CheckedInputStream cis = new CheckedInputStream(fis,new CRC32());
  ZipInputStream zis = new ZipInputStream(fis,charset);// 输入源zip路径
  ZipEntry entry=null;
  BufferedOutputStream bos=null;
  while ((entry=zis.getNextEntry())!=null) {
    if (entry.isDirectory()) {
    File filePath=new File(Parent+entry.getName());
    //如果目录不存在,则创建
    if (!filePath.exists()) {
      filePath.mkdirs();
    }
    }else{
    FileOutputStream fos=new FileOutputStream(Parent+entry.getName());
    bos=new BufferedOutputStream(fos);
    byte buf[] = new byte[1024];
    int len;
    while ((len = zis.read(buf)) != -1) {
      bos.write(buf, 0, len);
    }
    zis.closeEntry();
    //关闭的时候会刷新
    bos.close();
    }
  }
  zis.close();
  long endTime = System.currentTimeMillis();
  System.out.println("解压完成!所需时间为:"+(endTime-startTime)+"ms");
// System.out.println("校验和:"+cis.getChecksum().getValue());
  }

  private void checkFileName(String name) {
  //文件是否存在
  if (!new File(name).exists()) {
    System.err.println("要解压的文件不存在!");
    System.exit(1);
  }
  // 判断是否是zip文件
  int index = name.lastIndexOf(".");
  String str=name.substring(index+1);
  if (!"zip".equalsIgnoreCase(str)) {
    System.err.println("不是zip文件,无法解压!");
    System.exit(1);
  } 
    }

Zum Dekomprimieren verwenden Sie die Methode „ZipInputStream“. kontinuierlich, und dann wird Entry zur Beurteilung verwendet. Ich habe gehört, dass zipFile über einen integrierten Pufferstream verfügt, sodass das mehrmalige Dekomprimieren derselben Datei effizienter ist als ZipInputStream

Das obige ist der detaillierte Inhalt vonFallstudie zum Dekomprimieren und Komprimieren von Ordnern in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn