`

Java ZIP压缩和解压缩文件(解决中文文件名乱码问题)

阅读更多

 

JDK中自带的ZipOutputStream在压缩文件时,如果文件名中有中文,则压缩后的

zip文件打开时发现中文文件名变成乱码.

 

 

解决的方法是使用apache-ant-zip.jar包(见附件)中的ZipOutputStream和ZipEntry.

即,导入类:

 

import org.apache.tools.zip.ZipEntry; 

import org.apache.tools.zip.ZipOutputStream;

 

并且注意,压缩之前调用ZipOutputStream的out.setEncoding(System.getProperty("sun.jnu.encoding"));方法,

系统参数sun.jnu.encoding表示获取当前系统中的文件名的编码方式.这里将ZipOutputStream的文件名编码方式

设置成系统的文件名编码方式.

 

解压时,直接使用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);
  }

}

 

 

0
0
分享到:
评论

相关推荐

    java android zip解压缩(解决压缩中文乱码问题)

    本篇文章将深入探讨如何在Android平台上解决Java ZIP库在解压缩中文文件时出现的乱码问题。 首先,我们要明白乱码问题的根源。在文件的压缩和解压缩过程中,文件名通常被编码为字节序列,这个序列取决于原始文件名...

    java zip压缩解压工具解决中文乱码问题

    在Java编程中,处理压缩和解压缩ZIP文件是一项常见的任务,尤其当文件中包含中文字符时,可能会遇到中文乱码的问题。这是因为Java的标准库在处理非ASCII编码时可能存在不足。本篇文章将详细介绍如何使用Java标准库...

    SharpCompress 解压缩zip,rar文件,解决中文乱码

    本文将深入探讨如何使用SharpCompress这一开源库来处理ZIP和RAR文件,并解决在处理中文文件名时可能出现的乱码问题。 SharpCompress是一款强大的、跨平台的压缩库,支持多种压缩格式,包括ZIP、TAR、GZIP、BZIP2、7...

    Java压缩和解压缩zip文件

    在Java编程环境中,处理压缩和解压缩文件是一项常见的任务,特别是在需要打包或传输大量数据时。本篇文章将详细探讨如何使用Java内置的类库来实现ZIP文件的压缩和解压缩,以及解决中文文件名出现乱码的问题。 首先...

    ICSharpCode.SharpZipLib压缩解决中文乱码dll和代码

    总结,ICSharpCode.SharpZipLib通过设置正确的编码参数,可以有效地解决在处理中文文件名时出现的乱码问题。在创建和解压缩ZIP文件时,应特别注意文件名和内容的编码设置,以确保数据的完整性和正确性。

    java zip文件压缩与解压缩

    Apache Commons Compress库是Java中一个强大的工具,它提供了对多种压缩格式的支持,包括zip,而且能够处理中文文件名的问题,避免了因为字符编码不正确导致的乱码问题。 首先,我们要了解Java内置的`java.util.zip...

    java解决压缩中文乱码

    总的来说,解决Java压缩中文乱码问题的关键在于正确处理文件名的编码,确保使用UTF-8编码,并在必要时自定义压缩和解压缩流。通过上述方法,即使不依赖第三方库,也可以在Java程序中实现对中文文件名的完美支持。

    java实现对文件或文件夹的压缩和解压缩

    总结一下,Apache Commons Compress库是Java中处理压缩和解压缩任务的理想选择,尤其是对于处理包含中文文件名的压缩文件。通过`ZipArchiveOutputStream`和`ZipArchiveInputStream`,我们可以方便地实现对文件或...

    解决java压缩、解压缩含中文字符的文件或文件夹问题

    通过对JDK的java.util.zip下的ZipInputStream和ZipOutputStream类进行改造,彻底解决压缩和解压缩文件时的中文文件名乱码问题。 包含已大好的jar包,以及一个如何使用的Demo程序。

    Java处理中文文件名-压缩中文名字的文件.rar

    总结来说,Java处理中文文件名的关键在于了解编码的使用,并在创建、读取和压缩文件时正确地进行编码和解码。确保始终使用与文件系统和压缩格式兼容的编码,这样可以避免乱码问题。对于非标准格式如RAR,可能需要...

    java_zip压缩与解压缩(不支持中文,ant.jar包的下支持)

    因此,如果ZIP文件中的文件名包含中文,使用`java.util.zip`进行操作时,中文文件名可能会出现乱码。为了解决这个问题,开发者需要手动设置正确的字符编码,通常是UTF-8,来确保中文文件名能够正确处理。 Ant是一个...

    java解压和压缩tar包

    这个库特别强调了解决中文文件名乱码的问题,确保在处理包含非ASCII字符的文件名时,能够正确显示和保存。 在Java中,处理tar文件通常需要使用`java.util.zip`和`java.io`这两个包,但这些基础类库并不直接支持tar...

    压缩工具类改良版(解决中文乱码)

    在Java编程环境中,压缩和解压缩文件是一项常见的任务,尤其在数据传输、备份或存储时。本项目名为“压缩工具类改良版(解决中文乱码)”,它专注于解决使用`ZipEntry`进行文件压缩时遇到的中文乱码问题。这个问题...

    安卓文件下载上传解压相关-javaandroidzip解压缩解决压缩中文乱码问题).rar

    本文将深入探讨如何使用Java在Android环境中处理这些任务,特别是解决中文文件名在压缩和解压缩过程中可能出现的乱码问题。 首先,让我们关注文件的下载和上传。在Android中,我们可以使用`java.net.URL`和`java...

    java解压缩zip代码与用到的jar包

    在Java编程中,处理压缩和解压缩文件是常见的任务,特别是在构建自动化工具、数据传输或者存储优化场景下。本主题将深入讲解如何使用Java来解压缩ZIP文件,并介绍相关库和具体实现方法。 标题提到的"java解压缩zip...

    java实现的文件解压和压缩,没有中文编码问题

    在Java编程语言中,处理...通过上述方法,我们可以使用Java实现一个功能完善的、能够处理中文文件名的压缩和解压缩工具,避免出现乱码问题。这个工具对于处理包含中文字符的文件尤其有用,确保在不同环境下的正确性。

    支持中文的zip压缩解压

    在IT行业中,压缩和解压缩文件是常见的操作,特别是在数据传输和存储时。"支持中文的zip压缩解压"这个话题对于处理包含中文文件名或路径的文件集合尤其重要。在许多编程语言中,包括Java,处理中文字符可能会遇到...

    多文件压缩zip

    "多文件压缩zip"是指将多个文件合并成一个单一的压缩文件,通常以.zip格式。这个主题涵盖了解压缩过程,以及如何处理中文乱码问题。本文将深入探讨相关知识点。 首先,我们来了解ZIP文件格式。ZIP是一种广泛使用的...

    java压缩文件时的依赖jar包

    标题提到的"java压缩文件时的依赖jar包"很可能指的是用来解决此类问题的特定库。在这种情况下,`ant.jar`是一个关键的角色,它是Apache Ant项目的组成部分,它是一个基于Java的任务执行框架,常用于构建和部署项目,...

Global site tag (gtag.js) - Google Analytics