import java.io.*;
import java.util.*;
import java.util.zip.*;
public class Ans {
public static void main(String[] args) throws IOException {
//test0();
test1();
}
static void test0() throws IOException {
//壓縮是使用字節流,所以我們無法直接使用字符流,但是可以使用InputStreamReader來轉換
//使用GZIP對單文件壓縮
BufferedReader fr = new BufferedReader(new FileReader("test"));
BufferedOutputStream bos = new BufferedOutputStream(new GZIPOutputStream(new FileOutputStream("test.gz")));
int c;
while ((c = fr.read())!=-1)
bos.write(c);
bos.close();
fr.close();
BufferedReader br = new BufferedReader(new InputStreamReader(new GZIPInputStream(new FileInputStream("test.gz"))));
String s;
while ((s = br.readLine())!=null)
System.out.println(s);
}
static void test1() throws IOException {
//使用zip對多文件壓縮
CheckedOutputStream cos = new CheckedOutputStream(new FileOutputStream("test.zip"),new Adler32());
ZipOutputStream zos = new ZipOutputStream(cos);
BufferedOutputStream bos = new BufferedOutputStream(zos);
String []s = {"test","test2"};
zos.setComment("can this be read??");
for (String str: s) {
BufferedReader br = new BufferedReader(new FileReader(str));
zos.putNextEntry(new ZipEntry(str));
int c;
while ((c = br.read())!=-1)
bos.write(c);
br.close();
bos.flush(); //只有這樣才能寫入
}
bos.close();
System.out.println(cos.getChecksum().getValue());
/*CheckedInputStream cis = new CheckedInputStream(new FileInputStream("test.zip"),new Adler32());
ZipInputStream zis = new ZipInputStream(cis);
BufferedReader br = new BufferedReader(new InputStreamReader(zis));
ZipEntry ze;
while ((ze = zis.getNextEntry())!=null) {
System.out.println(ze+":");
String str;
while ((str = br.readLine())!=null)
System.out.println(" "+str);
}*/
ZipFile zp = new ZipFile("test.zip"); //使用ZipFile可以更簡便的讀取
System.out.println(zp.getComment()); //所寫的註釋只有使用ZipFile才能直接讀
Enumeration<? extends ZipEntry> e = zp.entries();
while (e.hasMoreElements()) {
ZipEntry ze = e.nextElement();
BufferedReader br = new BufferedReader(new InputStreamReader(zp.getInputStream(ze)));
String str;
while ((str = br.readLine())!=null)
System.out.println(str);
}
}
}