ZipInputStream和ZipEntry的问题
帮我看看,谢谢大家。
我用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;
}
}
我用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;
}
}
...全文
相关推荐
JDK ZipEntry压缩中文文件名乱码解决
项目中碰到问题.jdk zipEntry 压缩中文文件名乱码 上网查了下,有两种方法,一种修改jdk ZipInputStream及ZipOutputStream 的源文件,比较麻烦,不建议此项. 第二种 就是拿来主义,因为 开源项目 Ant 里已经有现成的实现.把ant.jar 加入到 工程下的lib目录即可. 如果仅用到压缩,就加入ant.jar 就导致引入了一些不必要的文件,所以我找到Ant1.8的源码,然后只把需要的那一部分编译打包成了一个jar文件,供大家使用
java解析zip文档,解决解析zip中解析xml和html文档流断的方法.pdf
java解析zip文档,解决解析zip中解析xml和html文档流断的方法.pdf
JAVA实现目录及文件的zip压缩和解压
JAVA实现目录及文件的zip压缩和解压
JAVA解压和压缩详解
JAVA解压和压缩详解,内有详细的使用例子
Java IO流 Zip文件的压缩和解压缩
NULL 博文链接:https://beijishiqidu.iteye.com/blog/1944225


Java SE
