Table of Contents
The ZipFileSystemBuilder and JarFileSystemBuilder classes can be used to build read only FileSystem:s on Zip and Jar files. There are also support classes for building new Zip and Jar files.
A ZipCreator object can be used to create a new Zip file. It builds the file using ZipEntryInfo objects that are returned from an Iterator. A ZipEntryInfo object contains information that the ZipCreator uses for creating a ZipEntry for a file or a directory in the Zip file.
EntityFS ZipCreator uses Java's ZipOutputStream to create Zip files. It is somewhat limited in how the created file can be configured. The At4J project has a Zip builder that can create more types of Zip files.
The EntityIteratorToZipEntryInfoIteratorAdapter can be used to adapt any kind of EntityView iterator to a ZipEntryInfo Iterator.
Below is a simple example of how a Zip file can be created.
Example 14.1. Building a Zip file
// Build a Zip file containing all files and directories under the directory d1. // Put the new file zip.zip in the directory d2. new ZipCreator( new EntityIteratorToZipEntryInfoIteratorAdapter(d1, Directories.getDepthLastIterator(d1)), d2, "zip.zip").create(); // The ZipCreator will acquire read locks on the files and directories // added to the Zip file when it needs them.
The next example is a slightly more advanced example that builds a Zip file from files in two different directory hierarchies.
Example 14.2. Building a Zip file from files in two directory hierarchies
// Build a Zip file containing all files and directories under the directory d1, // stored under /dirs/d1 and all directories and XML files under the directory // d2, stored under /xmldirs/d2 in the Zip file. Put the new file zip.zip in the // directory d3. new ZipCreator( new AggregatingIterator( new EntityIteratorToZipEntryInfoIteratorAdapter(d1, Directories.getDepthLastIterator(d1), new AbsoluteLocation("/dirs/d1")), new EntityIteratorToZipEntryInfoIteratorAdapter(d2, new FilteringIterator( Directories.getDepthLastIterator(d2), new EFileNameExtensionFilter("xml")), new AbsoluteLocation("/xmldirs/d2"))), d3, "zip.zip").create();
A Jar file can be built just like a Zip file. The JarCreator
works just like the ZipCreator, with the added
setManifest method for setting a Manifest.
Example 14.3. Building a Jar file
// Build a Jar file containing all files and directories under the directory d1. // Use a custom manifest. Put the new file jar.jar in the directory d2. new JarCreator( new EntityIteratorToJarEntryInfoIteratorAdapter(d1, Directories.getDepthLastIterator(d1)), d2, "jar.jar"). setManifest( new Manifest( new ByteArrayInputStream( // Note the trailing \n after the last row... "Manifest-Version: 1.0\nCreated-By: 1.0 me\n".getBytes()))).create();
To read the contents from a Zip or Jar file, create a Zip or Jar file system on the file and read entities from the file system.
Example 14.4. Reading entities from a Zip file
// Read the file d1/text2.txt from the Zip file texts.zip in the directory d FileSystem fs = new ZipFileSystemBuilder(). setZipFile(Directories.getFile(d, "texts.zip")). create(); try { info("Contents of text2.txt: " + Files.readTextFile( Directories.getFile( fs.getRootDirectory(), new RelativeLocation("d1/text2.txt")))); } finally { // Don't forget to close the Zip file system when you're done with it. fs.close(); }
If you want to just unzip a Zip or Jar archive, use any of
ZipFiles's unzip methods.
Example 14.5. Unzipping a Zip file
// Extract all text files from the Zip file texts.zip in directory d into a // directory tree under the directory d1. ZipFiles.unzip( Directories.getFile(d, "texts.zip"), d1, new EFileNameExtensionFilter("txt"));