Java 네이티브 압축 구성 요소가 중국어 파일 이름 디코딩을 지원하지 않는 문제 해결

4669 단어 java압축파일
최근 자바의 원생 Zip 압축 구성 요소가 압축 과정에서 파일 이름의 중국어 인코딩을 지원하지 않고 압축 과정에서 중국어 파일 이름을 혼란스럽게 만드는 것을 발견했다.아파치의 ant 패키지의 압축 구성 요소가 이 문제를 복구했습니다. 압축 기능을 사용할 때 중국어 파일 이름을 지원해야 한다면 아파치의 압축 구성 요소를 직접 사용해서 이 기능을 실현하는 것을 권장합니다.
구체적인 사용 방법:
1. Pom 파일에 Apache의 ant 도구 패키지에 dependency를 추가합니다.

    <dependency>
      <groupId>org.apache.ant</groupId>
      <artifactId>ant</artifactId>
      <version>1.9.3</version>
    </dependency>
머리글 참조에 사용된 클래스:

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;
2. 압축 방법이 실현되었습니다. 이 구성 요소는 설정 인코딩(setEncoding("GBK") 방법을 지원하여 중국어 인코딩 문제를 해결했습니다.

public static void compress(String srcPath , String dstPath) throws IOException{
    File srcFile = new File(srcPath);
    File dstFile = new File(dstPath);
    if (!srcFile.exists()) {
      throw new FileNotFoundException(srcPath + "does not exists");
    }

    FileOutputStream out = null;
    ZipOutputStream zipOut = null;
    try {
      out = new FileOutputStream(dstFile);
      zipOut = new ZipOutputStream(new BufferedOutputStream(out));
      zipOut.setEncoding("GBK");
      String baseDir = "";
      compress(srcFile, zipOut, baseDir);
    }
    catch (Throwable ex){
      throw new RuntimeException(ex);
    }
    finally {
      if(null != zipOut){
        zipOut.close();
        out = null;
      }

      if(null != out){
        out.close();
      }
    }
  }


private static void compress(File file, ZipOutputStream zipOut, String baseDir) throws IOException{
    if (file.isDirectory()) {
      compressDirectory(file, zipOut, baseDir);
    } else {
      compressFile(file, zipOut, baseDir);
    }
  }

  /**   */
  private static void compressDirectory(File dir, ZipOutputStream zipOut, String baseDir) throws IOException{
    File[] files = dir.listFiles();
    for (int i = 0; i < files.length; i++) {
      compress(files[i], zipOut, baseDir + dir.getName() + "/");
    }
  }

  /**   */
  private static void compressFile(File file, ZipOutputStream zipOut, String baseDir) throws IOException{
    if (!file.exists()){
      return;
    }

    BufferedInputStream bis = null;
    try {
      bis = new BufferedInputStream(new FileInputStream(file));
      ZipEntry entry = new ZipEntry(baseDir + file.getName());
      zipOut.putNextEntry(entry);
      int count;
      byte data[] = new byte[BUFFER];
      while ((count = bis.read(data, 0, BUFFER)) != -1) {
        zipOut.write(data, 0, count);
      }

    }finally {
      if(null != bis){
        bis.close();
      }
    }
  }

3. 압축 해제의 실현:

public static void decompress(String zipFile , String dstPath)throws IOException{
    File pathFile = new File(dstPath);
    if(!pathFile.exists()){
      pathFile.mkdirs();
    }
    ZipFile zip = new ZipFile(zipFile);
    for(Enumeration entries = zip.getEntries();entries.hasMoreElements();){
      ZipEntry entry = (ZipEntry)entries.nextElement();
      String zipEntryName = entry.getName();
      InputStream in = null;
      OutputStream out = null;
      try{
        in = zip.getInputStream(entry);
        String outPath = (dstPath+"/"+zipEntryName).replaceAll("\\*", "/");;
        // , 
        File file = new File(outPath.substring(0, outPath.lastIndexOf('/')));
        if(!file.exists()){
          file.mkdirs();
        }
        // , , 
        if(new File(outPath).isDirectory()){
          continue;
        }

        out = new FileOutputStream(outPath);
        byte[] buf1 = new byte[1024];
        int len;
        while((len=in.read(buf1))>0){
          out.write(buf1,0,len);
        }
      }
      finally {
        if(null != in){
          in.close();
        }

        if(null != out){
          out.close();
        }
      }
    }
  }

이상의 코드는 테스트를 거쳐 직접 사용할 수 있습니다.
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

좋은 웹페이지 즐겨찾기