- 浏览: 269824 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
liujunhao225:
jsoup 不是jsonp,请注意
使用JSONP 解析HTML网页。 -
ding2wife:
通过此文章终于知道他是干嘛的啦
android的armeabi和armeabi-v7a -
lkl:
真好的文章
android的armeabi和armeabi-v7a -
saturn54:
这真是好文章
android的armeabi和armeabi-v7a -
zhengfuzhou:
你好,咨询下,用google带的签名来签名,是哪个工具可以签名 ...
如何使Android应用程序获取系统权限
ZipInputStream解压有中文名的zip包
2008-08-01 13:36
下午闲来没事做,就想解决一下很久以前的一个问题,那就是java.util.zip.ZipInputStream解压文件的时候,如果包里有中 文名的文件,那报错,弄了一会儿,竟然解决了,不用像以前在网上查到的要重新编译jdk的。(jdk:sun jdk1.4.2)
1.重建zip包
新建一个自己的zip包,比如com.agile.zip,在这个包中把要用到的类从jdk的源码里放到这里,用eclipse可以很同快地完成这 个工作。需要所类 有:DeflaterOutputStream,InflaterInputStream,ZipConstants,ZipEntry,ZipInputStream,ZipOutputStream
上面这些类在放到com.aigle.zip包中后,在Eclipse中会显示出一些错误,这里要做得就是更改import以及其它一些工作,惟一的目的就是通过编译,不再出现编译错误。
2.修改ZipInputStream
ZipInputStream这个类中,需要修改getUTF8String这个方法,经过试验,用winRar压缩后的zip文件,其中的中文文件名是以gbk编码保存的,因此只需要在这个方法的前面加上
try {
String s = new String(b,off,len,"gbk");
return s;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
修改后的方法类似下面的代码:
private static String getUTF8String(byte[] b, int off, int len) {
try {
String s = new String(b,off,len,"gbk");
return s;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
// First, count the number of characters in the sequence
int count = 0;
int max = off + len;
...
...
}
3.去掉一些本地调用方法
原来的java.util.zip.ZipEntry里面,要加载本地库,在这里这些代码是没有用处的,去掉就可以了,而如果不去掉,会引起链接错误,很奇怪,这几个native方法我也没有找到在哪儿使用了,sun的jdk1.4.2里留着它们做什么呢?
static {
/* load the zip library */
java.security.AccessController.doPrivileged(
new sun.security.action.LoadLibraryAction("zip"));
initIDs();
}
4.测试
代码:这里是我修改后的zip包
加入解压缩测试代码文件名为unziptest.java:
/**
*
*/
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import com.agile.zip.ZipEntry;
import com.agile.zip.ZipInputStream;
/**
* @author lianjzh
*
*/
public class unziptest {
static final int BUFFER = 2048;
public static void main(String argv[]) {
try {
unziptest uz=new unziptest();
String zippath = "d:\\unzip\\";// /解压到的目标文件路径
String zipDir = "d:\\abc.zip";// 要解压的压缩文件的存放路径
File file = new File(zipDir);
String realname = file.getName();
System.out.println(realname);
int end = realname.lastIndexOf(".");
System.out.println("要解压缩的文件名.........."+zipDir);
System.out.println("解压到的目录" +zippath);
uz.ReadZip(zippath,zipDir);
} catch (Exception e) {
e.printStackTrace();
}
}
public void ReadZip(String zippath, String unzipPath) throws Exception {
try {
BufferedOutputStream dest = null;
FileInputStream fis = new
FileInputStream(unzipPath);//"d:\\abc.zip"
ZipInputStream zis = new
ZipInputStream(new BufferedInputStream(fis));
ZipEntry entry;
while ((entry = zis.getNextEntry()) != null) {
System.out.println("Extracting: " + entry);
int count;
byte data[] = new byte[BUFFER];
if (entry.isDirectory())// 如果为目录条目,则返回 true,执行下列语句
{
System.out.println("Dir: " + entry.getName() + " skipped..");
continue;
}
int begin = unzipPath.lastIndexOf("\\") + 1;
int end = unzipPath.lastIndexOf(".");
String zipRealName = unzipPath.substring(begin, end);
// write the files to the
dest = new BufferedOutputStream(
new FileOutputStream(getRealFileName(zippath + "\\"
+ zipRealName, entry.getName())));
// FileOutputStream fos = new
// FileOutputStream(wholepath);
//dest = new
// BufferedOutputStream(fos, BUFFER);
while ((count = zis.read(data, 0, BUFFER))
!= -1) {
dest.write(data, 0, count);
}
dest.flush();
dest.close();
}
zis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 给定根目录,返回一个相对路径所对应的实际文件名.
*
* @param zippath
* 指定根目录
* @param absFileName
* 相对路径名,来自于ZipEntry中的name
* @return java.io.File 实际的文件
*/
private File getRealFileName(String zippath, String absFileName) {
String[] dirs = absFileName.split("/", absFileName.length());
File ret = new File(zippath);// 创建文件对象
if (dirs.length > 1) {
for (int i = 0; i < dirs.length - 1; i++) {
ret = new File(ret, dirs[i]);
}
}
if (!ret.exists()) {// 检测文件是否存在
ret.mkdirs();// 创建此抽象路径名指定的目录
}
ret = new File(ret, dirs[dirs.length - 1]);// 根据 ret 抽象路径名和 child
// 路径名字符串创建一个新 File 实例
return ret;
}
}
2008-08-01 13:36
下午闲来没事做,就想解决一下很久以前的一个问题,那就是java.util.zip.ZipInputStream解压文件的时候,如果包里有中 文名的文件,那报错,弄了一会儿,竟然解决了,不用像以前在网上查到的要重新编译jdk的。(jdk:sun jdk1.4.2)
1.重建zip包
新建一个自己的zip包,比如com.agile.zip,在这个包中把要用到的类从jdk的源码里放到这里,用eclipse可以很同快地完成这 个工作。需要所类 有:DeflaterOutputStream,InflaterInputStream,ZipConstants,ZipEntry,ZipInputStream,ZipOutputStream
上面这些类在放到com.aigle.zip包中后,在Eclipse中会显示出一些错误,这里要做得就是更改import以及其它一些工作,惟一的目的就是通过编译,不再出现编译错误。
2.修改ZipInputStream
ZipInputStream这个类中,需要修改getUTF8String这个方法,经过试验,用winRar压缩后的zip文件,其中的中文文件名是以gbk编码保存的,因此只需要在这个方法的前面加上
try {
String s = new String(b,off,len,"gbk");
return s;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
修改后的方法类似下面的代码:
private static String getUTF8String(byte[] b, int off, int len) {
try {
String s = new String(b,off,len,"gbk");
return s;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
// First, count the number of characters in the sequence
int count = 0;
int max = off + len;
...
...
}
3.去掉一些本地调用方法
原来的java.util.zip.ZipEntry里面,要加载本地库,在这里这些代码是没有用处的,去掉就可以了,而如果不去掉,会引起链接错误,很奇怪,这几个native方法我也没有找到在哪儿使用了,sun的jdk1.4.2里留着它们做什么呢?
static {
/* load the zip library */
java.security.AccessController.doPrivileged(
new sun.security.action.LoadLibraryAction("zip"));
initIDs();
}
4.测试
代码:这里是我修改后的zip包
加入解压缩测试代码文件名为unziptest.java:
/**
*
*/
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import com.agile.zip.ZipEntry;
import com.agile.zip.ZipInputStream;
/**
* @author lianjzh
*
*/
public class unziptest {
static final int BUFFER = 2048;
public static void main(String argv[]) {
try {
unziptest uz=new unziptest();
String zippath = "d:\\unzip\\";// /解压到的目标文件路径
String zipDir = "d:\\abc.zip";// 要解压的压缩文件的存放路径
File file = new File(zipDir);
String realname = file.getName();
System.out.println(realname);
int end = realname.lastIndexOf(".");
System.out.println("要解压缩的文件名.........."+zipDir);
System.out.println("解压到的目录" +zippath);
uz.ReadZip(zippath,zipDir);
} catch (Exception e) {
e.printStackTrace();
}
}
public void ReadZip(String zippath, String unzipPath) throws Exception {
try {
BufferedOutputStream dest = null;
FileInputStream fis = new
FileInputStream(unzipPath);//"d:\\abc.zip"
ZipInputStream zis = new
ZipInputStream(new BufferedInputStream(fis));
ZipEntry entry;
while ((entry = zis.getNextEntry()) != null) {
System.out.println("Extracting: " + entry);
int count;
byte data[] = new byte[BUFFER];
if (entry.isDirectory())// 如果为目录条目,则返回 true,执行下列语句
{
System.out.println("Dir: " + entry.getName() + " skipped..");
continue;
}
int begin = unzipPath.lastIndexOf("\\") + 1;
int end = unzipPath.lastIndexOf(".");
String zipRealName = unzipPath.substring(begin, end);
// write the files to the
dest = new BufferedOutputStream(
new FileOutputStream(getRealFileName(zippath + "\\"
+ zipRealName, entry.getName())));
// FileOutputStream fos = new
// FileOutputStream(wholepath);
//dest = new
// BufferedOutputStream(fos, BUFFER);
while ((count = zis.read(data, 0, BUFFER))
!= -1) {
dest.write(data, 0, count);
}
dest.flush();
dest.close();
}
zis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 给定根目录,返回一个相对路径所对应的实际文件名.
*
* @param zippath
* 指定根目录
* @param absFileName
* 相对路径名,来自于ZipEntry中的name
* @return java.io.File 实际的文件
*/
private File getRealFileName(String zippath, String absFileName) {
String[] dirs = absFileName.split("/", absFileName.length());
File ret = new File(zippath);// 创建文件对象
if (dirs.length > 1) {
for (int i = 0; i < dirs.length - 1; i++) {
ret = new File(ret, dirs[i]);
}
}
if (!ret.exists()) {// 检测文件是否存在
ret.mkdirs();// 创建此抽象路径名指定的目录
}
ret = new File(ret, dirs[dirs.length - 1]);// 根据 ret 抽象路径名和 child
// 路径名字符串创建一个新 File 实例
return ret;
}
}
发表评论
-
Gson toJson FromJson 异常
2015-12-28 17:49 1660当一个Bean里面 还有 WeakReference 或者 ... -
8 个最优秀的 Android Studio 插件
2015-12-04 14:40 0Android Studio是目前Google官方设计的用 ... -
IntelliJ Idea 可以使用tab键跳出括号和引号吗?修改 就像Eclipse那样,打了左括号之后,自动出现一对括号,并在右边的括号后面出现一个切换点,
2015-12-04 14:13 3883http://www.zhihu.com/question ... -
深入浅出RxJava(一:基础篇)
2015-12-02 14:50 794原文链接 RxJava正在Andr ... -
Android 开发最佳实践
2015-12-02 14:46 742Via :https://github.com/futuri ... -
TortoiseGit 连接每次都要输入用户名和密码
2015-12-01 09:15 0TortoiseGit 连接每次都要输入用户名和密码 ... -
How to Design a Good API and Why it Matters
2015-02-15 19:31 678近日设计RMI到Infiniband网络的接口,发现如何设计 ... -
java 生成静态html的一段代码
2014-11-26 19:19 884java 生成静态html的一段代码 ... -
android 自定义Dialog背景透明及显示位置设置
2014-09-26 15:37 6534先贴一下显示效果图,仅作参考: ... -
Java 网页采集器
2014-09-19 15:13 783准备实现一个 网页采集器,需要完成 如下功能: 1. 采 ... -
AVOS保持数据。
2014-09-19 11:56 550使用AVOS保存复杂结构数据。 AVOSC ... -
使用JSONP 解析HTML网页。
2014-09-19 11:53 5468JSONP功能很强大,用来解析HTML非常方便。 // 解 ... -
使用HttpURLConnection向服务器发送post和get请求
2014-08-05 18:05 810一、使用HttpURLConnection向服务器 ... -
Gson简要使用笔记
2014-08-05 17:57 0Gson简要使用笔记 哇,原来我已经潜水2年 ... -
研究XMPP
2014-07-17 16:17 1108由于项目需要做一个基于XMPP协议的Android通讯软件。 ... -
Openfire 性能优化
2014-07-14 13:57 0Openfire 是一个XMPP协议的IM Server。 ... -
openfire_3.8.2集群配置
2014-07-07 11:36 513openfire_3.8.2集群配置 测试机4台1.四台机 ... -
Java开发:新工具、新框架、新思维
2014-06-17 14:12 2925郑晔:这个话题可能与我个人的经历有关。我的职业 ... -
JAVA 逻辑运算符的运算顺序的误解
2014-03-21 15:45 811先看下运算的代码: boolean test3=true||t ... -
Android编码规范
2014-03-21 12:51 750一、Android编码规范 ...
相关推荐
以上就是关于“ZipInputStream解压有中文名报错问题”的详细解析,包括问题的根源、关键概念以及多种解决方案。在实际开发中,根据项目需求和环境选择合适的解决策略是非常重要的,以确保程序能够正确处理各种情况下...
当我们尝试用这些类解压含有中文名的文件时,如果未正确处理字符编码,就会出现乱码或者解压失败。 为了解决这个问题,我们需要确保在读取ZIP文件时正确地设置字符编码。以下是一些关键步骤: 1. **设置正确的字符...
Java标准库提供了`java.util.zip`包,其中的`ZipInputStream`可以用于读取ZIP文件。为了处理中文文件名,我们需要在读取`ZipEntry`时手动指定编码。以下是一个示例代码: ```java ZipInputStream zis = new ...
在Java中,`java.util.zip`包提供了处理ZIP文件的功能,包括`ZipOutputStream`用于创建ZIP文件,`ZipInputStream`用于读取ZIP文件。但是,早期版本的Java对非ASCII字符的支持并不理想,尤其是在处理中文路径时。这是...
项目中碰到问题.jdk zipEntry 压缩中文文件名乱码 上网查了下,有两种方法,一种修改jdk ZipInputStream及ZipOutputStream 的源文件,比较麻烦,不建议此项. 第二种 就是拿来主义,因为 开源项目 Ant 里已经有...
### Java压缩文件目录成ZIP包最新技巧 在Java开发中,对文件或目录进行压缩是一项常见且实用的功能。本文将详细介绍如何使用`java.util.zip`包中的类来压缩文件及目录,并解决其中的一个常见问题——中文文件名或...
Java标准库提供了`java.util.zip`包,它包含了处理压缩文件所需的类和接口,如`ZipInputStream`和`ZipOutputStream`用于处理ZIP文件,`GZIPOutputStream`和`GZIPInputStream`用于处理GZIP文件。 2. **ZIP文件解...
标题提到的"java解压缩zip代码与用到的jar包"主要涉及了Java对ZIP文件的操作,以及一个名为`ant.jar`的第三方库。`ant.jar`是Apache Ant的核心库,它是一个基于Java的任务执行工具,广泛用于构建项目,其中包含了...
在Java编程语言中,解压ZIP文件涉及到使用Java标准库中的`java.util.zip`包。这个包提供了处理ZIP文件格式的类,如`ZipInputStream`和`ZipOutputStream`。然而,当处理包含非UTF-8编码(例如GBK)的中文文件名时,...
- 创建目标文件(如果包含中文名,确保使用UTF-8编码创建文件名)。 - 使用`BufferedOutputStream`将`ZipInputStream`的数据写入目标文件,完成文件的解压缩。 4. **关闭流**:解压完成后,记得关闭所有打开的输入...
在Java中,我们可以使用标准的`java.util.zip`包来处理ZIP文件。以下是获取APK信息的基本步骤: 1. **读取APK文件**:使用`ZipInputStream`或`ZipFile`来打开并读取APK文件。例如: ```java File apkFile = new ...
在Java中,`java.util.zip`包提供了ZipOutputStream和ZipInputStream用于创建和读取ZIP文件。为了处理中文乱码问题,关键在于设置正确的字符编码。在创建ZipEntry时,应使用UTF-8编码转换文件名,例如: ```java ...
在“压缩包子文件的文件名称列表”中,只有一个名为"zip"的文件,这可能是一个包含示例代码、库的DLL文件或者使用说明的ZIP文件。为了具体了解这个库如何使用,我们需要下载并解压缩这个文件,查看其中的内容。 总...