Maison  >  Article  >  Java  >  Étude de cas de décompression et de compression de dossiers en Java

Étude de cas de décompression et de compression de dossiers en Java

黄舟
黄舟original
2017-10-16 10:09:411582parcourir

Cet article présente principalement des informations pertinentes sur la décompression Java et les exemples de dossiers compressés. J'espère que cet article pourra aider tout le monde à réaliser de telles fonctions et à maîtriser de telles méthodes. Les amis dans le besoin pourront s'y référer

Détaillé. exemples de décompression Java et de dossiers compressés

Remarque : JDK7 prend en charge la définition du format d'encodage du paramètre d'encodage zipFile, zipInputStream, zipOutputStream, tous les formats d'encodage ajoutés, si jdk1.6 a besoin d'une autre assistance de package

Ce qui suit est le code du dossier compressé jdk intégré :


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();
  }

Ce qui suit est la décompression :

Voici les règles de décompression pour une bonne compression :

1 Si vous décompressez vers un dossier portant le même nom que le fichier compressé, décompressez directement

Si vous personnalisez un autre dossier xxx, créez d'abord xxx, puis placez-le dans le dossier décompressé

2 Lors de la compression, il utilise le format GBK, donc lors de la décompression Quand, par souci d'unification, la décompression GBK. est utilisé. Parlons encore de WINRAR. Parce que la compression RAR est brevetée (logiciel commercial), l'algorithme de compression RAR n'est pas public, mais l'algorithme de décompression est disponible, et sa compression est également au format GBK par défaut ; , nous avons constaté que peu importe si UTF-8 ou GBK est utilisé pour la compression, GBK peut être utilisé correctement pour la décompression ! (La raison spécifique n'est pas encore claire)

Ce programme Java est décompressé directement dans le dossier, par défaut, il est décompressé vers le même chemin que le fichier compressé


S'il y a. est un problème avec l'encodage de décompression, une erreur sera signalée : java.lang.IllegalArgumentException : MALFORMED


Si le fichier compressé a un mot de passe : une erreur est signalée : java.util.zip.ZipException : entrée ZIP cryptée non prise en charge


//方法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);
  } 
    }
Méthode 2 :


Utiliser zipFile pour décompresser La méthode est similaire à ZipInputStream. obtenu en continu, puis Entry est utilisé pour juger. J'ai entendu dire que zipFile avait un flux tampon intégré, donc décompresser le même fichier plusieurs fois est plus efficace que ZipInputStream


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn