Multifile storage with Zip
The library that supports the Zip format is much more extensive. With it you can easily store multiple files, and there’s even a separate class to make the process of reading a
//: c12:ZipCompress.java // Uses Zipcompression tocompress any // number of files given on the command line. // {Args: ZipCompress.java} // {Clean: test.zip} import com.bruceeckel.simpletest.*; import java.io.*; import java.util.*; import java.util.zip.*; public class ZipCompress { private static Test monitor = new Test(); // Throw exceptions to console: public static void main(String[] args) throws IOException { FileOutputStream f = new FileOutputStream("test.zip"); CheckedOutputStream csum = new CheckedOutputStream(f, new Adler32()); ZipOutputStream zos = new ZipOutputStream(csum); BufferedOutputStream out = new BufferedOutputStream(zos); zos.setComment("A test of Java Zipping"); // No corresponding getComment(), though. for(int i = 0; i < args.length; i++) { System.out.println("Writing file " + args[i]); BufferedReader in = new BufferedReader(new FileReader(args[i])); zos.putNextEntry(new ZipEntry(args[i])); int c; while((c = in.read()) != -1) out.write(c); in.close(); } out.close(); // Checksum valid only after the file has been closed! System.out.println("Checksum: " + csum.getChecksum().getValue()); // Now extract the files: System.out.println("Reading file"); FileInputStream fi = new FileInputStream("test.zip"); CheckedInputStream csumi = new CheckedInputStream(fi, new Adler32()); ZipInputStream in2 = new ZipInputStream(csumi); BufferedInputStream bis = new BufferedInputStream(in2); ZipEntry ze; while((ze = in2.getNextEntry()) != null) { System.out.println("Reading file " + ze); int x; while((x = bis.read()) != -1) System.out.write(x); } if(args.length == 1) monitor.expect(new String[] { "Writing file " + args[0], "%% Checksum: \\d+", "Reading file", "Reading file " + args[0]}, args[0]); System.out.println("Checksum: " + csumi.getChecksum().getValue()); bis.close(); // Alternative way to open and readzip files : ZipFile zf = new ZipFile("test.zip"); Enumeration e = zf.entries(); while(e.hasMoreElements()) { ZipEntry ze2 = (ZipEntry)e.nextElement(); System.out.println("File: " + ze2); // ... and extract the data as before } if(args.length == 1) monitor.expect(new String[] { "%% Checksum: \\d+", "File: " + args[0] }); } } ///:~
For each file to add to the archive, you must call putNextEntry( ) and pass it a ZipEntry object. The ZipEntry object contains an extensive interface that allows you to get and set all the data available on that particular entry in your Zip file: name,
To extract files, ZipInputStream has a getNextEntry( ) method that returns the next ZipEntry if there is one. As a more succinct alternative, you can read the file using a ZipFile object, which has a method entries( ) to return an Enumeration to the ZipEntries.
In order to read the checksum, you must somehow have access to the associated Checksum object. Here, a reference to the CheckedOutputStream and CheckedInputStream objects is retained, but you could also just hold onto a reference to the Checksum object.
A baffling method in Zip streams is setComment( ). As shown in ZipCompress.java, you can set a comment when you’re writing a file, but there’s no way to recover the comment in the ZipInputStream. Comments appear to be supported fully on an entry-by-entry basis only via ZipEntry.
Of course, you are not limited to files when using the GZIP or Zip libraries—you can compress anything, including data to be sent through a network connection.
출처 : http://www.linuxtopia.org/online_books/programming_books/thinking_in_java/TIJ314_033.htm
'Language > JAVA' 카테고리의 다른 글
Heap Dump 분석을 통한 Perm Area Memory Leak 원인 진단 (0) | 2010.12.14 |
---|---|
Java ARchives (JAR) (0) | 2010.11.17 |
자바 간단한 GZIP 압축 예제 (0) | 2010.11.17 |
자바 파일 압축 (0) | 2010.11.17 |
JAVA File Locking(자바 파일 잠금) (0) | 2010.11.17 |