EntityFS has support for using Zip and Jar files as backends for file systems, and also support for creating new Zip and Jar files.
There are three different Zip file systems
This file system, built by the At4jZipFileSystemBuilder, supports more kinds of Zip files than the file system backed by Java's Zip implementation. It requires the At4J library on the classpath.
The file system supports random access (FCRandomAccess) to files that are stored uncompressed in the Zip file. This makes it possible to build a new Zip file system on an uncompressed file in another Zip file system.
This Zip file system, built by the ZipFileSystemBuilder, supports the kinds of Zip files that Java's Zip implementation supports. It must be built on a File.
This file system, built by the JarFileSystemBuilder extends the Zip file system with support for JAR metadata.
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"));