ZipInputStream和ZipEntry的问题

zuoyangguang 2011-07-07 08:24:41
帮我看看,谢谢大家。

我用java代码生成了一个test.zip文件,然后调用getFileDataFromStream方法,

在getFileDataFromStream方法的data = new byte[(int) zipEntry.getSize()]; zipEntry.getSize()的值为-1.

若不用java代码生成test.zip文件,则没有问题。



package test;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

import org.seasar.framework.util.InputStreamUtil;
public class Test {

/**
* @param args
*/
public static void main(String[] args) {

File file=new File("testentry");
ZipOutputStream zipOutputStream = null;
try {
// file.createNewFile();

FileWriter fw=new FileWriter(file);//建立FileWriter对象,并实例化fw
//将字符串写入文件
fw.write("大家好!");
fw.write("本书是《JSP编程技巧》");
fw.write("请多多指教!");
fw.write("email:stride@sina.com");
fw.close();
InputStream input=new FileInputStream(file);
zipOutputStream = new ZipOutputStream(new FileOutputStream("test.zip"));
ZipEntry zipEntry = new ZipEntry("testentry");
zipEntry.setComment("12121");
zipEntry.setTime(new Date().getTime());
zipEntry.setSize(file.length());

zipOutputStream.putNextEntry(zipEntry);

byte[] buf = new byte[1024];
int temp=0;
while ((temp = input.read(buf, 0, 1024)) != -1) {
zipOutputStream.write(buf, 0, temp);
}
//
// while((temp=input.read())!=-1){
// zipOutputStream.write(temp);
// }
input.close();
zipOutputStream.close();
FileInputStream fileInputStream=new FileInputStream("test.zip");

getFileDataFromStream(fileInputStream,"testentry");
file.delete();
file=new File("test.zip");
file.delete();
} catch (IOException e) {

e.printStackTrace();
}
// FileInputStream fileInputStream;
// try {
// fileInputStream = new FileInputStream("test.zip");
//
// getFileDataFromStream(fileInputStream,"testentry");
// } catch (IOException e) {
// e.printStackTrace();
// }
}

public static byte[] getFileDataFromStream(InputStream in,
String name) throws IOException {

byte[] data = null;
ZipInputStream zipIn = null;
if (in == null) {
return null;
}
try {
BufferedInputStream bi = new BufferedInputStream(in);

zipIn = new ZipInputStream(bi);

ZipEntry zipEntry = null;
while ((zipEntry = zipIn.getNextEntry()) != null) {

if (name.equals(zipEntry.getName())) {
data = new byte[(int) zipEntry.getSize()];
zipIn.read(data, 0, (int) zipEntry.getSize());
}
}
} catch (IOException e) {
throw e;
} finally {
if (zipIn != null) {
InputStreamUtil.close(zipIn);
}
}
return data;
}

}
...全文
528 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
iis81365341 2011-07-11
  • 打赏
  • 举报
回复
应该是路径不对。
zuoyangguang 2011-07-11
  • 打赏
  • 举报
回复
这里不是有火龙果哥哥的么,帮我看看塞
zuoyangguang 2011-07-07
  • 打赏
  • 举报
回复
day day up
zn85600301 2011-07-07
  • 打赏
  • 举报
回复
http://www.west263.com/www/info/48573-1.htm帖子下面有例子 看看吧
zuoyangguang 2011-07-07
  • 打赏
  • 举报
回复
这里不是有火龙果哥哥的么,帮我看看塞
资源下载链接为: https://pan.quark.cn/s/1bfadf00ae14 在Java编程中,使用ZipInputStream解压ZIP文件时,如果文件名包含中文字符,可能会出现乱码或无法正确解压的问题。这是因为ZipInputStream默认不支持非ASCII字符集,导致中文字符在编码和解码过程中出错。要解决这一问题,需要理解以下几个关键概念: 字符编码:文件名是字符串,而字符串由特定字符编码表示。处理中文等非ASCII字符时,必须使用正确的编码(如GBK或UTF-8)。 Java的I/O流:ZipInputStream是基于字节的输入流,处理的是字节序列而非字符序列。因此,在解压时,需要将字节正确转换为字符,这涉及字符编码问题ZipEntry对象:在ZipInputStream中,每个文件或目录对应一个ZipEntry对象,其中包含文件名信息。读取文件名时,需要正确处理其编码。 解决方法如下: 自定义解压逻辑:创建一个自定义的ZipInputStream包装类,覆盖getNextEntry()方法,以便在读取文件名时,将其转换为正确的字符编码。 使用第三方库:例如Apache Commons Compress或Google的Guava库,这些库通常已解决了跨平台和多语言文件名的问题。 设置正确的字符编码:使用ZipFile类,在构造函数中传入Charset对象,指定文件名的编码。例如,如果文件名是UTF-8编码的,可以这样操作: 手动转换:如果使用ZipInputStream,可以在读取到字节数组后,手动用指定的字符编码进行转换,例如: 避免乱码问题:在创建ZIP文件时,确保文件名使用正确的编码,这样在解压时使用相同的编码就不会出现问题。 总之,在实际开发中,根据项目需求和环境选择合适的解决策略非常重要,以确保程序能够正确处理各种ZIP文件,尤其是包含

62,630

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧