- 浏览: 264361 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
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 1594当一个Bean里面 还有 WeakReference 或者 ... -
8 个最优秀的 Android Studio 插件
2015-12-04 14:40 0Android Studio是目前Google官方设计的用 ... -
IntelliJ Idea 可以使用tab键跳出括号和引号吗?修改 就像Eclipse那样,打了左括号之后,自动出现一对括号,并在右边的括号后面出现一个切换点,
2015-12-04 14:13 3829http://www.zhihu.com/question ... -
深入浅出RxJava(一:基础篇)
2015-12-02 14:50 764原文链接 RxJava正在Andr ... -
Android 开发最佳实践
2015-12-02 14:46 719Via :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 642近日设计RMI到Infiniband网络的接口,发现如何设计 ... -
java 生成静态html的一段代码
2014-11-26 19:19 856java 生成静态html的一段代码 ... -
android 自定义Dialog背景透明及显示位置设置
2014-09-26 15:37 6501先贴一下显示效果图,仅作参考: ... -
Java 网页采集器
2014-09-19 15:13 753准备实现一个 网页采集器,需要完成 如下功能: 1. 采 ... -
AVOS保持数据。
2014-09-19 11:56 509使用AVOS保存复杂结构数据。 AVOSC ... -
使用JSONP 解析HTML网页。
2014-09-19 11:53 5411JSONP功能很强大,用来解析HTML非常方便。 // 解 ... -
使用HttpURLConnection向服务器发送post和get请求
2014-08-05 18:05 780一、使用HttpURLConnection向服务器 ... -
Gson简要使用笔记
2014-08-05 17:57 0Gson简要使用笔记 哇,原来我已经潜水2年 ... -
研究XMPP
2014-07-17 16:17 1074由于项目需要做一个基于XMPP协议的Android通讯软件。 ... -
Openfire 性能优化
2014-07-14 13:57 0Openfire 是一个XMPP协议的IM Server。 ... -
openfire_3.8.2集群配置
2014-07-07 11:36 478openfire_3.8.2集群配置 测试机4台1.四台机 ... -
Java开发:新工具、新框架、新思维
2014-06-17 14:12 2886郑晔:这个话题可能与我个人的经历有关。我的职业 ... -
JAVA 逻辑运算符的运算顺序的误解
2014-03-21 15:45 772先看下运算的代码: boolean test3=true||t ... -
Android编码规范
2014-03-21 12:51 723一、Android编码规范 ...
相关推荐
对jdk内置的zip解压缩存在bug 如果zip文件里有中文文件,会报错 现在把这个问题解决。
1、文件解压zip通用机制方法、一行代码支持中文; 2、一行代码解决 java.util.zip.ZipInputStream 中文乱码; 3、删除指定路径内的所有文件通用机制方法;
有些时候需要替换zip内的文件。 网上的办法大多是——先解压,然后对解压目录替换文件,最后再重新压缩。该办法需要比较繁琐,且需要一个临时目录。 于是想找无需解压的方案。 后来找到利用 ZipInputStream、...
基于GUI用IO流中的ZipOutputStream ,ZipInputStream实现文件的解压与压缩, 如文件解压函数如下 private void unZip(String zipFileName, String outputDirectory)throws Exception { InputStream in=null; ...
项目中碰到问题.jdk zipEntry 压缩中文文件名乱码 上网查了下,有两种方法,一种修改jdk ZipInputStream及ZipOutputStream 的源文件,比较麻烦,不建议此项. 第二种 就是拿来主义,因为 开源项目 Ant 里已经有...
前端上传ZIP压缩文件 使用 ZipInputStream 来解压至指定目录中.
支持流(ZipInputStream和ZipOutStream) 读/写受密码保护的zip文件和流 支持AES和zip标准加密方法 支持Zip64格式 存储(无压缩)和放气压缩方法 从拆分的zip文件中创建或提取文件(例如:z01、z02、…zip) 在zip...
C# WPF 解压缩7zip文件 带进度条 sevenzipsharp WPF PNG实现的图形进度条 .NET 3.5 vs2013打开 来这里看介绍 http://www.cnblogs.com/xe2011/p/3761870.html
JAVA中文件压缩引起的乱码问题,是由于Java编码以Unicode 为基础的,所以ZipOutputStream(还有ZipInputStream) 处理压缩工作时,就以Unicode来处理中文。 所以为了能在压缩(或解压)时,不让其产生乱码问题,就得...
java实现文件解压缩,ZipInputStream,ZipOutputStream
ZipInputStream This is a FilterInputStream that reads the files in an zip archive one after another. ZipOutputStream This is a FilterOutputStream that writes the files into a zip archive one after ...
可以实现文件的压缩和解压 ZipFile zipInputStream ZipEntry zipOutputStream
通过对JDK的java.util.zip下的ZipInputStream和ZipOutputStream类进行改造,彻底解决压缩和解压缩文件时的中文文件名乱码问题。 包含已大好的jar包,以及一个如何使用的Demo程序。
zip压缩相关 1using System; 2using System.Collections.Generic; 3using System.Text; 4using System.IO; 5using ICSharpCode.SharpZipLib; 6using ICSharpCode.SharpZipLib.Zip; 7using ICSharpCode....
java中通过ZipOutputStream和ZipInputStream实现了zip压缩和解压功能。java源码————资源共享,一起进步。
效果 实现多个文件以及文件夹的压缩和解压 代码分析 import java.io.File; import java.io.FileInputStream;...import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; public class Mai
ZipInputStream s = new ZipInputStream(File.OpenRead(filePath1)); ZipEntry theEntry; while ((theEntry = s.GetNextEntry()) != null) { string fullname = Server.MapPath("ziptemp/" + urlid + "/" + the...
支持android和java加密压缩、解压封装好的类库,代码可以参考http://www.cnblogs.com/cmf34263/ 【java加密解压类库】文章
因为本人工作需要解压文件,但是出现中文乱码,但是又不想用ant.jar 所以就只有将zipInputStream更改。当然我是转载别人的,经测试可以使用哦,哈哈 http://zwllxs.iteye.com/blog/871260 这是地址
ZIP是一种较为常见的压缩形式,在Java中要想实现ZIP的压缩需要导入java.util.zip包,可以使用此包中的ZipFile、ZipOutputStream、ZipInputStream、ZipEntry几个类完成。 ZipOutputStream 实现文件的压缩 ...