package javaio; import java.io.*; import java.util.zip.*; public class ZipCompress{ public static void main(String args[]){ try{ ZipCompress zip=new ZipCompress(); FileOutputStream fileOut=new FileOutputStream("Example.zip"); CheckedOutputStream checkOut=new CheckedOutputStream(fileOut,new CRC32()); ZipOutputStream zipOut=new ZipOutputStream(new BufferedOutputStream(checkOut)); zipOut.setComment("This is a java zipping test file"); //String fileName=zip.getClass().getResource("test.txt").toString(); String fileName="E:\\java_study\\javaio\\test.txt"; System.out.println(fileName); System.out.println(zip.getClass()); BufferedReader in=new BufferedReader(new FileReader(fileName)); zipOut.putNextEntry(new ZipEntry(fileName));//建立压缩实体 int ch; //当压缩过程未结束时继续读写 while((ch=in.read())!=-1){ zipOut.write(ch); System.out.println(ch); } in.close(); zipOut.close(); }catch(IOException e){ System.out.println(e.toString()); } } }
以上就是全部的代码。这是涉及到流的操作,流这种东西,一个套一个的,超级复杂,一不小心就会搞混。现在针对该例子总结一下知识点。
FileOutputStream
文件输出流是用于将数据写入 File 或 FileDescriptor 的输出流。此处构造参数为表示文件路径的字符串。
CheckedOutputStream
需要维护写入数据校验和的输出流。校验和可用于验证输出数据的完整性。
构造方法为:CheckedOutputStream(OutputStream out, Checksum cksum) 。
这样就可以让它与FileOutputStream的实例关联起来了。第二个参数是表示数据校验和的接口。
此处使用CRC32,至于它到底是什么来的,本人知识水平有限,就贴个地址吧:http://baike.baidu.com/view/410181.htm
ZipOutputStream
此类为以 ZIP 文件格式写入文件实现输出流过滤器。包括对已压缩和未压缩条目的支持。
构造方法为ZipOutputStream(OutputStream out),这里的参数使用新建的BufferedOutputStream的实例。
实例的setComment方法可以用一个String作为参数设置注释内容。
实例的putNextEntry(ZipEntry e)用于写入新的ZipEntry。
ZipEntry的构造参数为一个String,但这个参数的意思不太清楚,应该是指要被压缩的文件吧。
void write方法写入数据。在写入所有字节之前,此方法将阻塞。这里的“阻塞”不太明白是什么意思。
BufferedOutputStream
该类实现缓冲的输出流。通过设置这种输出流,应用程序就可以将各个字节写入底层输出流中,而不必针对每次字节写入调用底层系统。
这里用已经建立的CheckedOutputStream的实例作为它的构造参数。另外,构造时还可以传递一个int类型的参数指定第一个参数的缓冲区大小。
BufferedReader
从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
可以传入一个Reader对象作为构造参数。
int read()方法用于读取单个字符。如果已经到达文件末尾,则返回-1
FileReader
用来读取字符文件的便捷类。换句话说就是从文件中读取字符,构造参数可以为一个File对象,或一个表示文件路径的String。
最后,记得关闭BufferedReader和ZipOutputStream,以释放资源。
另外有几点需要注意。如果设置了CLASSPATH环境变量:%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar,那么javac命令可以通过,但java命令却提示“noClassDefFoundError”这样的错误,原因不明。这点是从这里知道的:http://zhidao.baidu.com/question/66137804.html?fr=ala0。
还有,filename不能通过zip.getClass().getResource("test.txt").toString();这类的方法取得,因为这样会得到诸如以“file:\\”开头的字符串,而这样会出现异常的。
如果filename为E:\\java_study\\javaio\\test.txt,那么得到的zip文件会从“E”文件开始压缩,层层深入。而且只有在这一层上才能解压成功,如果在里面直接打开至test.txt,那么无法解压,会提示“! E:\java_study\Example.zip: 没有文件被解压”。