//我现在压缩都没有问题了。但是我在执行解压缩的时候,用递归的方式,sumList总是不能正确获取。可能是递归出了问题。不知道怎么解决。我希望获第一层压缩包里面的全部第二层压缩包,然后将第二层压缩包里的对象还原,组成新的结构。新的结构就是,一个大的list(就是第一层压缩包)里面又都是list(第二层压缩包)然后,这些list里面都是ZipObj 对象。不知道我说清楚了没有。不知道有没有人会认真看完。我现在觉得sumList就应该可以做到我说的结构了,可是结果总是冲掉,可能我递归用错了?      //另外感觉解压缩的时候会生成很多临时文件不知道有没有解决办法啊, String tmpName = UUID.randomUUID().toString() + System.nanoTime();就是这里
      //我觉得会生成很多临时文件在当前运行目录。  
  
public class TestZip {
// 第二层压缩文件名称
public static final String zipFileName = "c:/two.zip";
// 第二层zip文件内文件的名称
public static final String zipname = "objname";
// 第一层压缩文件名称
public static final String sumZipFileName = zipFileName + "sum.zip";
// 第一层zip文件内文件的名称
public static final String sumzipname = "sumzipname.zip";
// 临时名称
public static final String name = "zhangsan"; public static void main(String[] args) throws FileNotFoundException,
IOException, ClassNotFoundException {
// 创建zip
createZip();
// 将zip解压还原出对象
List sumList = new ArrayList();
unzip(new FileInputStream(new File(sumZipFileName)), sumList);
                  System.out.println("sumList:=="+sumList.size());
System.out.println("The End。。");
} /**
 * 
 * 递归解压缩
 * 
 */
public static void unzip(FileInputStream input, List sumList)
throws IOException, ClassNotFoundException {
ZipInputStream zipIns = new ZipInputStream(input);
ZipEntry zipEntry = zipIns.getNextEntry();
BufferedInputStream bis = new BufferedInputStream(zipIns);
Map map = null;
while (zipEntry != null) {
List list = new ArrayList();
String tmpName = UUID.randomUUID().toString() + System.nanoTime();
FileOutputStream ous = new FileOutputStream(tmpName);
byte[] tmp = new byte[1024];
Integer len = null;
while ((len = bis.read(tmp)) != -1)
ous.write(tmp, 0, len);
ous.flush();
ous.close();
FileInputStream fileInStream = new FileInputStream(tmpName);
String fileName = zipEntry.getName();
if (fileName.endsWith(".zip")) {
unzip(fileInStream, sumList);
return;
}
ObjectInputStream objectInStream = new ObjectInputStream(
fileInStream);
ZipObj p = (ZipObj) objectInStream.readObject();
System.out.println("p.getName()==" + p.getName());
map = new HashMap();
map.put(zipEntry.getName(), p);
list.add(map);
sumList.add(list);
zipEntry = zipIns.getNextEntry();
}
zipIns.close();
} private static void createZip() throws IOException {
ZipObj obj = new ZipObj("vivian", 25);
// 将obj对象压成zip
FileOutputStream fileOutStream = new FileOutputStream(name);
ObjectOutputStream objectOutStream = new ObjectOutputStream(
fileOutStream);
objectOutStream.writeObject(obj);
objectOutStream.close();
FileInputStream fileInStream = new FileInputStream(name);
ZipOutputStream zipOutput = new ZipOutputStream(new FileOutputStream(
zipFileName));
zipOutput.putNextEntry(new ZipEntry(zipname));
// 将对象变成文件然后压缩成zip
addFile(zipOutput, fileInStream);
zipOutput.close();
ZipOutputStream zipOutputsum = new ZipOutputStream(
new FileOutputStream(sumZipFileName));
// 最外层压缩包内应该有三个压缩文件
for (int i = 0; i < 3; i++) {
// 将上面生成的Zip在压缩成新的zip
FileInputStream fileInStreamsum = new FileInputStream(zipFileName);
zipOutputsum.putNextEntry(new ZipEntry(UUID.randomUUID().toString()
+ "_" + sumzipname));
// 将对象变成文件然后压缩成zip
addFile(zipOutputsum, fileInStreamsum);
}
zipOutputsum.close();
}
/**
 * 
 * 压缩
 * 
 */
private static void addFile(ZipOutputStream zipOutput, FileInputStream ins)
throws IOException {
byte[] tmp = new byte[1024];
int len = 0;
BufferedInputStream bis = new BufferedInputStream(ins);
while ((len = bis.read(tmp)) != -1)
zipOutput.write(tmp, 0, len);
ins.close();
}
}class ZipObj implements Serializable {
private String name;
private int age; public ZipObj(String name, int age) {
this.name = name;
this.age = age;
} public int getAge() {
return age;
} public String getName() {
return name;
}
}