자바 ZIP 압축 및 압축 해제 파일 (중국어 파일 이름 난 장 판 문제 해결)

더 읽 기
 
JDK 에서 가 져 온 ZipOutput Stream 은 파일 을 압축 할 때 파일 이름 에 중국어 가 있 으 면 압축 된 것 입 니 다.
zip 파일 을 열 었 을 때 중국어 파일 이름 이 어 지 러 워 진 것 을 발 견 했 습 니 다.
 
 
해결 방법 은 apache - ant - zip. jar 패키지 (첨부 파일 참조) 의 Zip Output Stream 과 ZipEntry 를 사용 하 는 것 입 니 다.
가 져 오기 클래스:
 
import org.apache.tools.zip.ZipEntry; 
import org.apache.tools.zip.ZipOutputStream;
 
또한 압축 하기 전에 ZipOutputStream 의 out. setEncoding (System. getProperty ("sun. jnu. encoding") 을 호출 합 니 다.방법
시스템 매개 변수 sun. jnu. encoding 은 현재 시스템 의 파일 이름 을 가 져 오 는 인 코딩 방식 을 표시 합 니 다. 여기 서 ZipOutput Stream 의 파일 이름 인 코딩 방식 을 사용 합 니 다.
시스템 파일 이름 인 코딩 방식 으로 설정 합 니 다.
 
압축 을 풀 때 JDK 의 원래 ZipInputStream 을 직접 사용 하면 됩 니 다.
 
그러나 주의해 야 할 점 은 ZIP 파일 을 읽 기 전에 설정 해 야 한 다 는 것 이다.
System.setProperty("sun.zip.encoding", System.getProperty("sun.jnu.encoding"));
시스템 의 ZIP 인 코딩 형식 을 시스템 파일 이름 인 코딩 방식 으로 설정 합 니 다. 그렇지 않 으 면 압축 해제 타 임 스 이상 입 니 다.
(인터넷, 그리고 ZipInputStream 소스 코드 를 수정 하 는 방식 이 너무 번 거 로 운 것 같 습 니 다. 참고:http://zwllxs.iteye.com/blog/871260)
 
ZIP 코드 참조http://szhnet.iteye.com/blog/199059수정
package io;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.CRC32;
import java.util.zip.CheckedOutputStream;

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;

public class Zip
{
  static final int BUFFER = 8192;

  public Zip()
  {

  }

  private static void compress(File file, ZipOutputStream out, String basedir)
  {
    /*           */
    if (file.isDirectory())
    {
      // System.out.println("  :" + basedir + file.getName());
      compressDirectory(file, out, basedir);
    }
    else
    {
      // System.out.println("  :" + basedir + file.getName());
      compressFile(file, out, basedir);
    }
  }

  /**        */
  private static void compressDirectory(File dir, ZipOutputStream out, String basedir)
  {
    if (!dir.exists()) return;

    File[] files = dir.listFiles();
    for (int i = 0; i < files.length; i++)
    {
      /*    */
      compress(files[i], out, basedir + dir.getName() + "/");
    }
  }

  /**        */
  private static void compressFile(File file, ZipOutputStream out, String basedir)
  {
    if (!file.exists())
    {
      return;
    }
    try
    {
      BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
      ZipEntry entry = new ZipEntry(basedir + file.getName());
      out.putNextEntry(entry);
      int count;
      byte data[] = new byte[BUFFER];
      while ((count = bis.read(data, 0, BUFFER)) != -1)
      {
        out.write(data, 0, count);
      }
      bis.close();
    }
    catch (Exception e)
    {
      throw new RuntimeException(e);
    }
  }

  public static void zip(String srcPathName, String zipFileName)
  {
    File file = new File(srcPathName);
    File zipFile = new File(zipFileName);
    if (!file.exists()) throw new RuntimeException(srcPathName + "   !");
    try
    {
      FileOutputStream fileOutputStream = new FileOutputStream(zipFile);
      CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream, new CRC32());
      ZipOutputStream out = new ZipOutputStream(cos);
      out.setEncoding(System.getProperty("sun.jnu.encoding"));//         
      String basedir = "";
      compress(file, out, basedir);
      out.close();
    }
    catch (Exception e)
    {
      throw new RuntimeException(e);
    }
  }

  public static void main(String[] args)
  {
    Zip.zip("D:\\D\\dll", "D:\\D\\dll.zip");
  }
}

 
UnZip 코드:
package io;

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 UnZip
{

  public static void unzip(String zipFilePath, String destDir)
  {
    System.setProperty("sun.zip.encoding", System.getProperty("sun.jnu.encoding")); //            
    //System.out.println(System.getProperty("sun.zip.encoding")); //ZIP    
    //System.out.println(System.getProperty("sun.jnu.encoding")); //        
    //System.out.println(System.getProperty("file.encoding")); //             
    
    File dir = new File(destDir);
    // create output directory if it doesn't exist
    if (!dir.exists()) dir.mkdirs();
    FileInputStream fis;
    // buffer for read and write data to file
    byte[] buffer = new byte[1024];
    try
    {
      fis = new FileInputStream(zipFilePath);
      ZipInputStream zis = new ZipInputStream(fis);
      ZipEntry ze = zis.getNextEntry();
      while (ze != null)
      {
        String fileName = ze.getName();
        File newFile = new File(destDir + File.separator + fileName);
        //System.out.println("Unzipping to " + newFile.getAbsolutePath());
        // create directories for sub directories in zip
        new File(newFile.getParent()).mkdirs();
        FileOutputStream fos = new FileOutputStream(newFile);
        int len;
        while ((len = zis.read(buffer)) > 0)
        {
          fos.write(buffer, 0, len);
        }
        fos.close();
        // close this ZipEntry
        zis.closeEntry();
        ze = zis.getNextEntry();
      }
      // close last ZipEntry
      zis.closeEntry();
      zis.close();
      fis.close();
    }
    catch (IOException e)
    {
      e.printStackTrace();
    }

  }

  public static void main(String[] args)
  {
    String zipFilePath = "D:\\D\\dll.zip";

    String destDir = "D:\\D\\dll_zip";

    UnZip.unzip(zipFilePath, destDir);
  }

}

 
 
  • apache-ant-zip.jar (23.3 KB)
  • 다운로드 횟수: 164
  • 좋은 웹페이지 즐겨찾기