以下代码是以递归法压缩一个目录下的所有文件public class TZipFolder
{
           public static void main(String[] args)
{
try
{   
File f1=new File("E:\\dir");
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("F:\\dir.zip"));
ZipOutputStream zos=new ZipOutputStream(bos);
zipDir(f1,bos,zos);

zos.flush();
zos.finish();
zos.close();
bos.close();

catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public static void zipDir(File f,BufferedOutputStream bos,ZipOutputStream zos) throws IOException
{  
   File fList[]=f.listFiles();
   FileInputStream fis=null;
   BufferedInputStream bis=null;

   if(fList!=null)
   {
  for(int i=0;i<fList.length;i++)
  {
  if(fList[i].isDirectory())
  {   
  zipDir(fList[i],bos,zos);
  }
  else
  {
      fis=new FileInputStream(fList[i]);
      bis=new BufferedInputStream(fis);
      byte b[]=new byte[bis.available()];
  bis.read();
  zos.setMethod(ZipOutputStream.DEFLATED);
  ZipEntry ze=new ZipEntry(fList[i].getName());
  zos.putNextEntry(ze);
  zos.write(b);
  zos.flush();
  //zos.finish();
  System.out.println("file:"+fList[i].getAbsolutePath()+",size before:"+fis.available()+",size after:"+ze.getSize());
  }
  }
   }
   else
   {
  System.out.println("@@List end!!!");
   }
   
   fis.close();
   bis.close();
   
}
}现在代码有三个问题1 压缩后的文件再解压,得到的文件和原来的文件大小一样,字节不差,但是就不能打开。
2 如果我源目录中还有子目录结构的,怎样把子目录的结构也在zip包中生成呢?现在这种算法是把源目录中所有的文件(包括它的子目录中的文件)都归在一个zip包的根目录下了。
3 怎样得到压缩后的ZipEntry的大小?会其中一个问题都可以回复。谢谢。

解决方案 »

  1.   

    你可以看一下 //Java编程思想// 关于JavaIO的介绍。还有 //Java网络编程// 中JavaIO的介绍。
    还有参考一下 TrueZip工具包 的源码。
    我曾经做过,时间太久忘记了。我的项目现在时间很紧,抱歉现在不能给出解决方法。
      

  2.   

    对每一个文件构造 ZipEntry的时候不能只传文件名要传 相对于要压缩目录 (E:\\dir )的父目录 也就是 E:\\改一下就可以了ZipEntry ze=new ZipEntry(fList[i].getAbsolutePath().replace(File.separatorChar,'/').substring(4)); // 4 为 E:\\
    的长度
      

  3.   

    还有一个问题 bis.read(); 改成 bis.read(b); 你的程序没有好像没有读数据