>  기사  >  Java  >  Java에서 폴더 압축 해제 및 압축 사례 연구

Java에서 폴더 압축 해제 및 압축 사례 연구

黄舟
黄舟원래의
2017-10-16 10:09:411632검색

이 글은 주로 Java 압축 해제 및 압축 폴더 예제에 대한 정보를 소개합니다. 이 글이 모든 사람이 이러한 기능을 깨닫고 그러한 방법을 익힐 수 있도록 도움이 되기를 바랍니다.

java 압축 해제 및 압축 폴더의 자세한 예

참고: JDK7은 인코딩 설정을 지원하고 인코딩 형식 zipFile, zipInputStream 및 zipOutputStream에 인코딩 형식이 추가되었습니다. jdk1.6인 경우 다른 패키지 지원이 필요합니다

다음은 내장된 jdk 압축 폴더 코드입니다.


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

압축해제 방법은 다음과 같습니다.

압축을 잘하기 위한 압축해제 규칙은 다음과 같습니다.

1 압축파일과 같은 이름의 폴더에 압축을 풀면 직접 압축을 푼다

다른 폴더 xxx를 사용자 정의한 후 xxx를 먼저 만든 다음 압축이 풀린 폴더에 넣으세요

2. Haoyi는 압축할 때 GBK 형식을 사용하므로 압축을 풀 때는 균일성을 위해 GBK 압축 풀기를 사용하세요. WINRAR에 대해 이야기해 보겠습니다. 다시 RAR 압축은 특허(상용 소프트웨어)이기 때문에 RAR 압축 알고리즘은 공개되지 않지만 압축 해제 알고리즘은 사용 가능하며 압축도 기본적으로 GBK 형식입니다.
테스트 후 압축과 관계없이 발견되었습니다. 압축을 풀 때는 UTF-8 또는 GBK를 사용하고, 압축을 풀 때는 GBK를 사용하여 올바르게 압축을 풀어보세요! (구체적인 이유는 아직 불명)

본 자바 프로그램은 폴더에 직접 압축이 풀립니다. 기본적으로 압축파일과 동일한 경로에 압축이 풀립니다.

압축해제 인코딩에 문제가 있을 경우 오류가 발생합니다. 보고됨: java.lang.IllegalArgumentException: MALFORMED

압축 파일에 비밀번호가 있는 경우: 오류가 보고됨: java.util.zip.ZipException: 암호화된 ZIP 항목이 지원되지 않음


//方法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);
  } 
    }

방법 2:

zipFile을 사용하여 압축을 풉니다. 방법은 ZipInputStream과 유사하며, Entry를 사용하여 판단합니다. zipFile에는 버퍼 스트림이 내장되어 있으므로 동일한 파일을 여러 번 압축 해제하는 것이 더 효율적이라고 들었습니다. 시간


 public void dozip(String zipfile) throws IOException {
  checkFileName(zipfile);
  long startTime = System.currentTimeMillis();
  // 获取待解压文件的父路径
  File zfile = new File(zipfile);
  String Parent = zfile.getParent() + "/";
  // 设置,默认是UTF-8
  Charset charset = Charset.forName("GBK");
  ZipFile zip = new ZipFile(zipfile, charset);
  ZipEntry entry = null;
  //封装解压后的路径
  BufferedOutputStream bos=null;
  //封装待解压文件路径
  BufferedInputStream bis=null;
  Enumeration<ZipEntry> enums = (Enumeration<ZipEntry>) zip.entries();
  while (enums.hasMoreElements()) {
    entry = enums.nextElement();
    if (entry.isDirectory()) {
    File filePath = new File(Parent + entry.getName());
    // 如果目录不存在,则创建
    if (!filePath.exists()) {
      filePath.mkdirs();
    }
    }else{
    bos=new BufferedOutputStream(new FileOutputStream(Parent + entry.getName()));
    //获取条目流
bis =new BufferedInputStream(zip.getInputStream(entry));
    byte buf[] = new byte[1024];
    int len;
    while ((len = bis.read(buf)) != -1) {
      bos.write(buf, 0, len);
    }

    bos.close();
    }
  }
  bis.close();
  zip.close();
  System.out.println("解压后的路径是:"+Parent);
  long endTime = System.currentTimeMillis();
  System.out.println("解压成功,所需时间为:"+(endTime-startTime)+"ms");
  }

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

위 내용은 Java에서 폴더 압축 해제 및 압축 사례 연구의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.