java压缩文件用ZipInputStream无法解压,下面是源代码

privatestaticvoidextZipFileList(StringzipFileName,StringextPlace){try{System.out.prin... private static void extZipFileList(String zipFileName, String extPlace) {
try {

System.out.println("解压方法源文件:"+zipFileName);
System.out.println("解压方法地址:"+extPlace);
FileInputStream in = new FileInputStream(new File(zipFileName));
ZipInputStream zipInputStream = new ZipInputStream(in);

System.out.println("解压输入流的getNextEntry()值为:"+zipInputStream.getNextEntry());
ZipEntry entry = null;
while ((entry = zipInputStream.getNextEntry()) != null) {

String entryName = entry.getName();

if (entry.isDirectory()) {
File file = new File(extPlace + entryName);
file.mkdirs();
System.out.println( "创建文件夹: " + entryName);
} else {

FileOutputStream os = new FileOutputStream(extPlace
+ entryName);

// Transfer bytes from the ZIP file to the output file
byte[] buf = new byte[1024];

int len;
while ((len = in.read(buf)) > 0) {
os.write(buf, 0, len);
}
os.close();
in.close();
zipInputStream.close();
}
}

} catch (IOException e) {
}
System.out.println("解压文件成功 ");
}

}

另一种方法代码:
private static void extZipFileList(String zipFileName, String extPlace) {
try {

System.out.println("解压方法源文件:"+zipFileName);
System.out.println("解压方法地址:"+extPlace);
ZipInputStream in = new ZipInputStream(new FileInputStream(zipFileName));
System.out.println("解压输入流的getNextEntry():"+extPlace);
ZipEntry entry = null;

// System.out.println(in.getNextEntry());
while ((entry = in.getNextEntry()) != null) {

String entryName = entry.getName();

if (entry.isDirectory()) {
File file = new File(extPlace + entryName);
file.mkdirs();
System.out.println( "创建文件夹: " + entryName);
} else {

FileOutputStream os = new FileOutputStream(extPlace
+ entryName);

// Transfer bytes from the ZIP file to the output file
byte[] buf = new byte[1024];

int len;
while ((len = in.read(buf)) > 0) {
os.write(buf, 0, len);
}
os.close();
in.closeEntry();

}
}

} catch (IOException e) {
}
System.out.println("解压文件成功 ");
}

}

打印输出:
源文件:E:/temp_workspace/tmp/nms/ftp/EMS.rar
解压地址:E:/temp_workspace/tmp/nms/temp/
解压输入流的getNextEntry()值为:null

谁知道到底是什么问题?该怎么解决
rar格式的文件直接修改后缀名为zip是否可以转换成zip格式?如果是通过http协议下载rar格式的文件页面会直接打开,若直接改后缀名为zip的话,就会出现一个下载提示框
展开
 我来答
百度网友9308069
推荐于2017-10-16 · TA获得超过1万个赞
知道大有可为答主
回答量:3947
采纳率:89%
帮助的人:1938万
展开全部
我想代码基本没有错,可以解压zip文件
但你的输入文件是rar。
rar和zip是完全不同的算法。rar是商业压缩格式,zip是公开格式。
java的预置库目前无法直接解压rar ,需要用第三方库
追问
呵呵,我刚也想可能是这个问题,但是修改了rar的后缀为zip,然后运行结果

解压方法源文件:E:/temp_workspace/tmp/nms/ftp/EMS.zip
解压方法地址:E:/temp_workspace/tmp/nms/temp/
解压输入流的getNextEntry()值为:null
解压文件成功
文件名:EMS.zip

我想可能成功了,结果一看,文件还是没有解压到目录中
追答
1、确保输入文件不是RAR。rar和zip的内容格式不一样,怎么可能因为“修改了rar的后缀为zip”而更改内容。

再次强调
“java的预置库目前无法直接解压rar ,需要用第三方库 ”
RAR和ZIP是两种有天壤之别的文件格式,
仅仅给rar文件改个zip文件名,是荒诞无意义的

2、刚刚没细看,代码有多处错误。
private static void extZipFileList(String zipFileName, String extPlace) {
try {

System.out.println("解压方法源文件:"+zipFileName);
System.out.println("解压方法地址:"+extPlace);
FileInputStream in = new FileInputStream(new File(zipFileName));
ZipInputStream zipInputStream = new ZipInputStream(in);
//错误 不能这么调试
//System.out.println("解压输入流的getNextEntry()值为:"+zipInputStream.getNextEntry());
ZipEntry entry = null;
while ((entry = zipInputStream.getNextEntry()) != null)
{

String entryName = entry.getName();

if (entry.isDirectory()) {
File file = new File(extPlace + entryName);
file.mkdirs();
System.out.println( "创建文件夹: " + entryName);
} else {

FileOutputStream os = new FileOutputStream(extPlace
+ entryName);

// Transfer bytes from the ZIP file to the output file
byte[] buf = new byte[1024];

int len;
//错误 用错流
while ((len = zipInputStream.read(buf)) > 0) {
os.write(buf, 0, len);
}
//错误 关错流
os.close();
}
}
//错误 关错流
//in.close();
zipInputStream.close();
} catch (Exception e) {
System.out.println("有错误");
e.printStackTrace();
}
System.out.println("解压文件成功 ");
}
========
以上代码已纠正,指出了纠正的地方
经测试可以用于解压zip文件
(原问题的范围是如何解压zip文件及纠正代码错误,已经符合题意。)
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
302652034_bai
2017-10-16 · TA获得超过4145个赞
知道大有可为答主
回答量:2206
采纳率:66%
帮助的人:1550万
展开全部
rar和zip的压缩算法都不一样,改个后缀就能变过来想的太天真
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
385lphuir
2011-07-05 · TA获得超过1247个赞
知道大有可为答主
回答量:3592
采纳率:90%
帮助的人:819万
展开全部
直接用FileInputStream读文件到内存,然后用OutputStream输出到客户端,因为是二进制流操作,源文件是什么格式,输出的就是什么格式。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式