站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题请帮忙看一段代码

请帮忙看一段代码

摘要: 请帮忙看一段代码


以下代码是以递归法压缩一个目录下的所有文件

public class TZipFolder
{
public static void main(String[] args)
{
try
{
File f1=new File(-#34;E://dir-#34;);
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(-#34;F://dir.zip-#34;));
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-#60;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(-#34;file:-#34;+fList[i].getAbsolutePath()+-#34;,size before:-#34;+fis.available()+-#34;,size after:-#34;+ze.getSize());
}
}
}
else
{
System.out.println(-#34;@@List end!!!-#34;);
}

fis.close();
bis.close();

}


}

现在代码有三个问题

1 压缩后的文件再解压,得到的文件和原来的文件大小一样,字节不差,但是就不能打开。
2 如果我源目录中还有子目录结构的,怎样把子目录的结构也在zip包中生成呢?现在这种算法是把源目录中所有的文件(包括它的子目录中的文件)都归在一个zip包的根目录下了。
3 怎样得到压缩后的ZipEntry的大小?

会其中一个问题都可以回复。谢谢。




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


对每一个文件构造 ZipEntry的时候不能只传文件名

要传 相对于要压缩目录 (E://dir )的父目录 也就是 E://

改一下就可以了

ZipEntry ze=new ZipEntry(fList[i].getAbsolutePath().replace(File.separatorChar,-#39;/-#39;).substring(4)); // 4 为 E://
的长度




还有一个问题

bis.read(); 改成 bis.read(b);

你的程序没有好像没有读数据


↑返回目录
前一篇: log4j配置文件应放到哪里呀
后一篇: Timer -amp