Java 对zip文件中含有中文子文件操作

小鱼仔做文件压缩解压的时候,开始并没有注意细节,使用的java jdk中zip操作工具类

这样导致的问题是对中文操作都是乱码,要么就是破损。

查阅资料才知道这个实在1.6的历史遗留问题

还好开源的apache 提供了一个支持包,让我们拿过来就可以用。

下面是下载链接

提供jar包下载链接:http://download.csdn.net/detail/u010962482/8748091

废话不多说 贴上解压压缩代码。

 /**
     * 解压文件到指定目录
     * @param zipFile
     * @param descDir
     * @author isea533
     */
    @SuppressWarnings( "rawtypes")
    public static void unZipFiles(String zip_s_File,String descDir){
     OutputStream out= null;
     InputStream in = null;
     File zipFile= new File(zip_s_File);

        //判断解压路径是否存在,不存在则创建
     File pathFile = new File(descDir);
        if(!pathFile.exists()){
            pathFile.mkdirs();
        }
        //创建待解压文件夹路径
        ZipFile zip;
           try {
<span style="white-space:pre">		</span>//注意 这里的编码 按自己情况自己填写
              zip = new ZipFile(zipFile,"gbk" );
               for(Enumeration   entries = zip.getEntries();entries.hasMoreElements();){
                 ZipEntry entry = (ZipEntry)entries.nextElement();
                 String zipEntryName = entry.getName();
                 in = zip.getInputStream(entry);
                 String outPath = (descDir+zipEntryName).replaceAll("\\*" , "/" );;
                 //输出文件路径信息  ,如果存在文件则覆盖,如果不想覆盖修改OUTputStream的Boolean类型
                 System. out.println(outPath);
                  out = new FileOutputStream(outPath,true );
                 byte[] buf1 = new byte[1024];
                 int len;
                 while((len=in.read(buf1))>0){
                     out.write(buf1,0,len);
                 } 

                 }
               System. out.println("******************解压完毕********************" );
          } catch (IOException e) {
              System. out.println("解压文件失败" );
              e.printStackTrace();
          } finally{
               try {
                   in.close();
                 out.close();
              } catch (Exception e2) {
                   System. out.println("管理io流失败" );
                   e2.printStackTrace();
              }
          }

    } 

    /**
    *
    * @param sourceFilePath   需要压缩 zip 路径
    * @param zipFilePath      zip压缩文件路径
    * @param fileName         zip 名字
    * @return
    */
   public static boolean fileToZip(String sourceFilePath,String zipFilePath,String fileName){
      boolean flag = false ;
      File sourceFile = new File(sourceFilePath);
      FileInputStream fis = null;
      BufferedInputStream bis = null;
      FileOutputStream fos = null;
      ZipOutputStream zos = null;

      if(sourceFile.exists() == false){
          System. out.println("待压缩的文件目录:" +sourceFilePath+"不存在." );
      } else{
              File zipFile = new File(zipFilePath + "/" + fileName +".zip" );

          try {       if(zipFile.exists()){
                  System. out.println(zipFilePath + "目录下存在名字为:" + fileName +".zip" + "打包文件." );
              } else{
                  File[] sourceFiles = sourceFile.listFiles();
                  if(null == sourceFiles || sourceFiles.length<1){
                      System. out.println("待压缩的文件目录:" + sourceFilePath + "里面不存在文件,无需压缩." );
                  } else{
                      fos = new FileOutputStream(zipFile);
                      zos = new ZipOutputStream(new BufferedOutputStream(fos));
                      zos.setEncoding( "gbk");
                      byte[] bufs = new byte[1024*10];
                      for(int i=0;i<sourceFiles.length ;i++){
                          //创建ZIP实体,并添加进压缩包
                          ZipEntry zipEntry = new ZipEntry(sourceFiles[i].getName());

                          zos.putNextEntry(zipEntry);
                          //读取待压缩的文件并写进压缩包里
                          fis = new FileInputStream(sourceFiles[i]);
                          bis = new BufferedInputStream(fis, 1024*10);
                          int read = 0;
                          while((read=bis.read(bufs, 0, 1024*10)) != -1){
                              zos.write(bufs,0,read);
                          }
                      }
                      flag = true;
                  }
              }
          } catch (FileNotFoundException e) {
              e.printStackTrace();
              throw new RuntimeException(e);
          } catch (IOException e) {
              e.printStackTrace();
              throw new RuntimeException(e);
          } finally{
              //关闭流
              try {
                  if(null != bis) bis.close();
                  if(null != zos) zos.close();
              } catch (IOException e) {
                  e.printStackTrace();
                  throw new RuntimeException(e);
              }
          }
      }
      return flag;
  }
时间: 2024-10-07 18:17:21

Java 对zip文件中含有中文子文件操作的相关文章

python3处理json文件中含有中文dumps的应用

python3的编码问题一直比较简单 内存中字符串采用unicode 存储到文件中采用utf-8 以下为str,byte互相转换的过程: str = "abc学习" str Out[6]: 'abc学习' mybyte = str.encode("utf-8") mybyte Out[8]: b'abc\xe5\xad\xa6\xe4\xb9\xa0' str2 = mybyte.decode("utf-8") str2 Out[10]: 'ab

路径或文件名中含有中文的jar文件双击启动不了 -&gt; Java7的Bug?

至从安装了java7后,才发现部分可执行的jar文件双击都启动不了了. 比如所有的jar文件放在桌面上双击启动不了. 比如所有的文件名中含有中文的jar文件双击启动不了. 比如一个 abc.jar 放在c:\下可以双击启动,但移动到桌面上,双击启动不了了. 比如一个放在c:\下的abc.jar可以双击启动,如果移动到c:\我的jar文件夹\abc.jar 双击启动不了了. 以前在java6下好像没出现这样的事情... 2011-10-13

解决Java工程路径中含有中文的情况

问题: 当Java工程路径中含有中文时,得不到正确的路径 *** 解决: 这其实是编码转换的问题.当我们使用ClassLoader的getResource方法获取路径时,获取到的路径被URLEncoder.encode(path,"utf-8")编码了,当路径中存在中文和空格时,他会对这些字符进行转换,这样,得到的往往不是我们想要的真实路径,所以我们可以调用URLDecoder.decode()方法进行解码,以便得到原始的中文及空格路径. Java代码 : String package

Java解压缩zip文件

下面实现的功能是zip文件中的图像文件解压到当前目录下,用jdk自带的处理zip文件的代码处理的,但是不能处理中文名称的文件,要不然就会出错. Java代码   import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import jav

java读取.properties文件及解决中文乱码问题

Java项目中有些信息(例如web的配置信息)可能要放在.properties文件中,那我们应该怎么来读取它们呢,下面给出一个工具类做一说明,并解决了中文乱码问题: 1.其中config.properties文件信息如下: name=\u843D\u82B1\u6709\u610Fwang王 str=\u6D41\u6C34\u65E0\u60C5 boolean=true 2.PropertiesUtil工具类读取.properties文件 import java.io.BufferedInp

Java处理Zip文件

最近一直在找Java处理Zip文件方面的资料,感觉这几篇还不错,作个链接memo. Java使用基本JDK操作ZIP文件 http://blog.csdn.net/zhyh1986/article/details/7723649 Java解压带密码的Rar压缩文件 http://blog.csdn.net/zhyh1986/article/details/7724616 https://github.com/jukka/java-unrar Java解压和压缩带密码的zip文件 http://b

Silverlight读取Zip文件中的图片与视频

首先看看Demo的截图: 下面我将一步步展示实现这个Demo的过程,这个需求就是读出Zip文件中的图片与视频. Demo整体架构: 首先我们准备几张图片和视频,然后将其压缩至resource.zip文件中,做完之后,我们建立一个resource.xml文件记录压缩包内的资源 <?xml version="1.0" encoding="utf-8" ?> <files> <file type="video" name=

asp.net 遍历文件夹下全部子文件夹并绑定到gridview上

遍历文件夹下所有子文件夹,并且遍历配置文件某一节点中所有key,value并且绑定到GridView上 C#代码   Helper app_Helper = new Helper(); DataSet ds = new DataSet(); DataTable dt = new DataTable(); protected void Page_Load(object sender, EventArgs e) { gvwBind(); } #region 绑定GridView /// <summa

005.使用百度SDK写hello baidumap时,在布局xml文件中添加地图控件时;提示&#39;clickable&#39; attribute found, please also add &#39;focusable&#39; 错误

0.报错&提示信息: 'clickable' attribute found, please also add 'focusable'  A widget that is declared to be clickable but not declared to be focusable is not accessible via the keyboard. Please add the focusable attribute as well. 1.原因: 一个控件,如果没有定义focusable