Java中压缩与解压--中文文件名乱码解决办法

解决Java中使用ZIP压缩中文文件名乱码问题 Java中,使用ZIP压缩文件时,经常会遇到中文文件名乱码的问题。这是因为ZIP格式在处理非ASCII字符时存在一些限制,导致中文文件名无法正确显示。下面将介绍一种解决这个问题的方法,并提供相应的源代码示例。通过使用Unicode编码转换,我们可以确保在ZIP文件中正确存储和显示中文文件名,从而解决中文文件名乱码的问题。如果你有任何问题,请随时提问。对象,并设置了编码为UTF-8。最后,我们关闭输入输出流,完成文件的压缩。对象,并将文件名设置为中文文件名。在上面的示例代码中,我们创建了一个。 阅读详情

本文参阅了台湾JSP学习网部分内容,略有增删.

java对於文字的编码是以 unicode为基础,因此,若是以ZipInputStream及ZipOutputStream来处理压缩及解压缩的工作,碰到中文档名或路径,那当然是以unicode来处理罗!但是,现在市面上的压缩及解压缩软体,例如winzip,却是不支援unicode的,一碰到档名以unicode编码的档案,它就不处理。 那要如何才能做出让WinRar能够处理的压缩档呢?那就得从修改ZipInputStream及ZipOutputStream对於档名的编码方式来着手了。我们可以从jdk的src.zip取得ZipInputStream及ZipOutputStream的原始码来加以修改

一、ZipOutputStream.java
1.从jdk的src.zip取得ZipOutputStream.java原始码,另存到一个新文件中,档名改为CnZipOutputStream.java。
2.开始修改原始码,将class名称改为CnZipOutputStream
3.建构式也必须更改为CnZipOutputStream
4.新增member,这个member记录编码方式
  private String encoding="UTF-8";
5.再新增一个建构式(这个建构式可以让这个class在new的时候,设定档名的编码)
  public CZipOutputStream(OutputStream out,String encoding) {
     this(out);
     this.encoding=encoding;
  }
6.找到byte[] nameBytes = getUTF8Bytes(e.name);(有二个地方),将它修改如下:

  1. byte[] nameBytes = null;
  2.  try
  3.  {
  4.  if (this.encoding.toUpperCase().equals("UTF-8"))
  5.  nameBytes =getUTF8Bytes(e.name);
  6.  else
  7.  nameBytes= e.name.getBytes(this.encoding);
  8.  }
  9.  catch(Exception byteE)
  10.  {
  11.  nameBytes=getUTF8Bytes(e.name);
  12.  }


二、ZipInputStream.java
1.从jdk的src.zip取得ZipInputStream.java原始码,另存到一个新文件中,档名改为CnZipInputStream.java。
2.开始修改原始码,将class名称改为CnZipInputStream
3.建构式也必须更改为CnZipInputStream
4.新增member,这个member记录编码方式
  private String encoding="UTF-8";
5.再新增一个建构式如下(这个建构式可以让这个class在new的时候,设定档名的编码)
public CZipInputStream(InputStream in,String encoding) {
  this(in);
  this.encoding=encoding;
}

6.找到ZipEntry e = createZipEntry(getUTF8String(b, 0, len));这一行,将它改成如下:
  1. ZipEntry e=null;
  2.  try
  3.  {
  4.  if (this.encoding.toUpperCase().equals("UTF-8"))
  5.  e=createZipEntry(getUTF8String(b, 0, len));
  6.  else
  7.  e=createZipEntry(new String(b,0,len,this.encoding));
  8.  }
  9.  catch(Exception byteE)
  10.  {
  11.  e=createZipEntry(getUTF8String(b, 0, len));
  12.  }



以上两个档案储存後compile产生CZipOutputStream.class及CZipInputStream.class,使用winzip开启 [java_home]/jre/lib/rt.jar这个档案,将CnZipOutputStream.class及 CnZipInputStream.class加进去,以後当压缩及解压缩时有中文档名及路径的问题时,就可以指定编码方式来处理了。

使用方法:
CnZipOutputStream zos=new CnZipOutputStream(OutputStream os,String encoding);
CnZipInputStream zins=new CnZipInputStream(InputStream ins,String encoding);

对于前面文章中文件打包下载中遇到的中文文件问题,解决手法是:
OutputStream os = response.getOutputStream();
CnZipOutputStream zos = new CnZipOutputStream(os,"gbk"); //加上中文编码类型

 

Tags: java
 
Linux | i.MX6ULL Mqtt 移植教程 本文介绍了MQTT协议在物联网中的应用及其实现工具Mosquitto的移植过程。使用Ubuntu 16.04环境和gcc交叉编译器,详细说明了从X86平台安装测试到ARM开发板移植的完整步骤。重点包括:Mosquitto的安装配置、服务启动测试方法、依赖库openssl和libuuid的交叉编译过程、路径参数修改要点,以及最终在开发板上的功能测试验证。文中提供了具体的命令操作和路径修改示例,强调路径一致性对编译成功的重要性。该移植方案实现了轻量级MQTT协议在嵌入式设备中的应用。 阅读详情

相关推荐

【实战】Python 携程酒店价格实时抓取爬虫项目全解析

摘要:本文介绍了一个基于Python的携程酒店价格实时抓取系统开发方案。系统采用Requests、BeautifulSoup和Selenium等技术栈,实现了多城市、多日期的酒店数据采集,包括价格、评分、位置等关键信息。通过请求头伪装、IP代理、随机等待等反爬策略,有效应对携程的反爬机制。系统支持数据清洗、去重和CSV/Excel导出,并提供了多线程优化、代理池集成等进阶方案。本文详细阐述了技术原理、代码实现和优化策略,同时强调了数据采集的合法合规性,为旅游行业数据分析提供了可靠的数据获取方案。

2503_91057718的博客 2567

解析zip压缩文件内包含中文名称 ZipInputStream不能支持中文解决

使用java代码解压zip压缩文件时,文件或文件夹出现中文名称是报错 ZipInputStream默认使用UTF_8 // An highlighted block /** * Creates a new ZIP input stream. * * <p>The UTF-8 {@link java.nio.charset.Charset charset} ...

slx765633632的博客 6360

ZipInputStream解压中文名报错问题解决

jdk内置的zip解压缩存在bug 如果zip文件里有中文文件,会报错 现在把这个问题解决。

java解压文件名乱码_解决JDKZipEntry压缩文件名乱码的两种方法

当我们在创建java的项目过程中,有时候会遇到一些棘手的问题,就比如说:在JDkzipEntry压缩中文文件名出现乱码的问题。那么对于这个问题,我们应该怎样来解决呢?今天我们就一起来学习一下它的解决方案吧。希望这篇教程对于大家有所帮助。在教程开始之前,小编先为大家简单的介绍一下JDKZipEntry压缩包吧。其实他是一个用来设置.zip的压缩包。ZipEntry使用从指定ZIP条目获取的字段创建...

weixin_28889765的博客 1582

java解压缩包,在linux下,Aix系统下乱码处理方法

需求:大批量的数据,包含多级目录,目录结构不确定,最后的文件为excel,最终目的是将excel中的数据导入到数据库。开始是做的在页面上传,压缩文件太大,有230多M,页面直接就报错了。后来就是修改为直接读取服务器的文件 import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipFile; import jx...

shuixian 586

mysql ibdata1文件的缩小操作(转载)

mysql ibdata1文件的缩小操作   转载出处:http://www.2cto.com/database/201302/189638.html 最近发现MYSQL 的碎片狂大,在一张有上千万的表空间里面碎片占用十分厉害,但是单独的用alert table table_name engine=innodb 基本无法执行,因为表实在是过大,ALERT方法适合一些中小型的数据库。所以最后...

peace 488

ibdata1文件--缩小mysql数据库的ibdata1文件

缩小mysql数据库的ibdata1文件

crazyhacking的专栏 1116

MySQL的ibdata1文件占用过大

处理MySQL的ibdata1文件过大问题 本人遇到一次在安装zabbix监控的时候,yum安装的MySQL数据库,后面用了一段时间发现data目录下的ibdata1的空间特别大,反而我的zabbix数据库的空间很小,这样的情况在后面备份zabbix数据库的时候会很不方便,所以想着要怎么解决下。 ibdata1文件是什么? ibdata1是一个用来构建innodb系统表空间的文件,这个文...

weixin_30826761的博客 1931

MySql ibdata1文件太大如何缩小

MySql innodb如果是共享表空间,ibdata1文件越来越大,达到了30多个G,对一些没用的表进行清空: truncate table xxx; 然后optimize table xxx; 没有效果 因为对共...

clcj66885的博客 126

mysql:ibdata1和mysql-bin log管理

MySql ibdata1文件太大如何缩小MySql innodb如果是共享表空间,ibdata1文件越来越大,达到了30多个G,对一些没用的表进行清空:truncate table xxx;然后optimize table xxx; 没有效果因为对共享表空间不起作用。mysql ibdata1存放数据,索引等,是MYSQL的最主要的数据。如果不把数据分开存放的话,这个文件的大小很容易...

197

mysql ibdata1文件的缩小

mysql ibdata1存放数据,索引等,是MYSQL的最主要的数据。 如果不把数据分开存放的话,这个文件的大小很容易就上了G,甚至10+G。对于某些应用来说,并不是太合适。因此要把此文件缩小。 方法:数据文件单独存放。 步骤: 1,备份数据库 从命令行进入MySQL Server 5.0/bin备份全部数据库,执行命令mysqldump -q -uusername -pyourp...

weixin_30451709的博客 72

【MYSQL】关于MYSQL数据库ibdata1文件缩小及错误日志清除方法

为什么80%的码农都做不了架构师?>>> ...

weixin_34143774的博客 239

Mysql优化ibdata1大小

在MySQL数据库中,如果不指定innodb_file_per_table参数来单独存在每个表的数据,MySQL的数据都会存放在ibdata1文件。mysql ibdata1存放数据,索引等,是MYSQL的最主要的数据源。 随着数据的增长,ibdata1的存储的数据也会越来越多,相应的体积也会越来越大。并且郁闷的是,当你删掉一些数据时,ibdata1的体积并不会减少。造成磁盘空间的浪费,影响磁盘...

weixin_30263277的博客 415

收缩Mysql的ibdata1文件大小方法

bdata1是mysql数据库中一个数据文件了,你会发现它来越大了,下面我来介绍收缩Mysql的ibdata1文件大小方法 如果你有使用InnoDB来存储你的Mysql表,使用默认设置应该会碰到个非常头疼的问题,在Mysql的数据目录里有个默认只有10MB叫 ibdata1的文件没日没夜的增长让你烦透了吧?里面包含了InnoDB引擎存储的所有索引和数据信息,很可惜Mysql...

weixin_30478923的博客 68

mysql ibdata1文件的如何缩小 利用innodb_file_per_table=1

参考链接 http://www.xpcmd.cn/post/658.html http://www.mysqlsupport.cn/innodb%E5%85%B1%E4%BA%AB%E8%A1%A8%E7%A9%BA%E9%97%B4vs%E7%8B%AC%E7%AB%8B%E8%A1%A8%E7%A9%BA%E9%97%B4/ 1备份数据库 停止mysql服务 2在...

weixin_34018202的博客 447

Mysql单文件存储删除数据Bug文件容量不会减少

Mysql的Bug之一:InnoDB ibdata1 never shrinks after data is removed问题描述当innodb引擎使用单个文件进行存储的时候,当对数据库中数据进行删除的时候,文件的大小并不会发生变化,意味着文件将会越来越大并且即使删除也没办法 让其释放磁盘的空间。验证过程创建一个测试使用的表,如下创建好t这样的一个表。创建简单的存储过程来批量的插入数据。查看开始

王洋的专栏 2379

mysql ibdata 分开

  转载地址 http://deeplyloving.iteye.com/blog/1542234 不知道为什么 innodb_file_per_table  没有设置成innodb的默认配置   共享表空间不会收缩! ibdata1 只会一个劲的增长。对于一台服务器上面n个库而且存在库的删除的情况就郁闷了。     mysql ibdata1存放数据,索引等,是MYSQL的最主要的...

lihuachuan007的博客 141

AS5600磁编码器获取角度(IIC方式)的简单应用

AS5600是一个易于编程的磁旋转位置传感器,具有高分辨率的12位模拟或PWM输出。该传感器采用非接触式系统,可测量磁化轴上直径的绝对角度,并适用于应用于非接触式电位器的稳健设计,消除了外部杂散磁场的影响。AS5600的设计目的是为了满足工业标准,并通过I²C接口支持简单的用户编程,无需专门的程序员即可设置非易失性参数。默认情况下,输出表示0到360度的范围。此外,用户还可以定义一个较小的输出范围,并通过编程设置零角(起始位置)和最大值角度(停止位置)。此外,AS5600还配备了智能低功耗模式,可自动降低功耗。在使用时,输入引脚(DIR)可选择输出的极性以反映旋转方向。如果DIR接地,则输出值随顺时针旋转而增加;如果DIR连接到VDD,则输出值逆时针旋转而增加。

上一篇: 什么是JMS(转)
下一篇: jsp中实现压缩文件下载
robin622
博客等级 码龄19年 15粉丝 127原创
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值