ZipWriterpublic class ZipWriter extends Object
Fields Summary |
---|
private String | dirName | private ZipOutputStream | zipStream | private byte[] | buffer | private ZipItem[] | items |
Constructors Summary |
---|
public ZipWriter(String zipFilename, String dirName)
init(zipFilename, dirName);
createItemList(null);
| public ZipWriter(String zipFilename, String dirName, ZipItem[] theItems)
items = theItems;
init(zipFilename, dirName);
| public ZipWriter(String zipFilename, String dirName, String[] fileList)
init(zipFilename, dirName);
createItemList(fileList);
| public ZipWriter(OutputStream outStream, String dirName, String[] fileList)
init(outStream, dirName);
createItemList(fileList);
|
Methods Summary |
---|
private void | addEntry(ZipItem item)
int totalBytes = 0;
FileInputStream in = new FileInputStream(item.file);
ZipEntry ze = new ZipEntry(item.name);
zipStream.putNextEntry(ze);
for(int numBytes = in.read(buffer); numBytes > 0; numBytes = in.read(buffer))
{
zipStream.write(buffer, 0, numBytes);
totalBytes += numBytes;
}
/* Bug 4753245
* WBN 11/22/02
* The in.close() method was missing -- causing problems when trying to delete this file in
* other code -- at least until the garbage collector gets around to closing it.
* Normally I wouldn't put this inside a try/catch -- an error ought to be returned,
* but this is a special low-risk-toleration time. Adding the try/catch is safer. The
* code will behave exactly like before if an Exception is thrown. It can't possibly hurt anything
* to add the close()
*/
try // note: feel free to remove this try sometime in the future!
{
in.close();
}
catch(Exception e)
{
// ignore it
Reporter.warn("Couldn't close the FileInputStream for the file: " + item.file);
}
zipStream.closeEntry();
Reporter.verbose("Wrote " + item.name + " to Zip File. Wrote " + totalBytes + " bytes.");
| private void | createItemList(java.lang.String[] files)
try
{
if(files == null)
{
FileListerRelative lister = new FileListerRelative(new File(dirName));
files = lister.getFiles();
}
if(files.length <= 0)
throw new ZipFileException("No files to add!");
items = new ZipItem[files.length];
for(int i = 0; i < files.length; i++)
{
File f = new File(dirName + files[i]);
items[i] = new ZipItem(f, files[i].replace('\\", '/")); // just in case...
}
}
catch(Throwable t)
{
throw new ZipFileException(t);
}
| java.lang.String | getDirName()
return dirName;
| private void | init(java.lang.String outFileName, java.lang.String dirName)
try
{
init(new FileOutputStream(outFileName), dirName);
}
catch(Exception e)
{
throw new ZipFileException(e);
}
| private void | init(java.io.OutputStream outStream, java.lang.String dirName)
try
{
// note -- these asserts will be caught & repackaged as a ZipFileException
Reporter.insist(dirName);
//make sure it's really a directory
File f = new File(dirName);
Reporter.insist(f.exists(), "directory (" + dirName + ") doesn't exist");
Reporter.insist(f.isDirectory());
// change the filename to be full-path & UNIX style
try
{
dirName = f.getCanonicalPath();
}
catch(IOException e)
{
Reporter.warn("Couldn't getCanonicalPath() for " + dirName);
}
dirName = dirName.replace('\\", '/"); // all UNIX-style filenames...
// we need the dirname to end in a '/'
if(!dirName.endsWith("/"))
dirName += "/";
this.dirName = dirName;
zipStream = new ZipOutputStream(outStream);
}
catch(Throwable t)
{
throw new ZipFileException(t);
}
| public static void | main(java.lang.String[] args)
Reporter.setSeverityLevel(0);
if(args == null || args.length != 2)
usage();
try
{
ZipWriter zw = new ZipWriter(args[0], args[1]);
zw.write();
Reporter.verbose("" + zw);
}
catch(ZipFileException e)
{
Reporter.verbose("ZipFileException: " + e);
System.exit(0);
}
| public void | safeWrite()Does not throw an exception when there is a duplicate zip entry.
try
{
for(int i = 0; i < items.length; i++)
{
try
{
addEntry(items[i]);
}
catch (ZipException e)
{
// ignore - duplicate zip entry
}
}
zipStream.close();
}
catch(ZipFileException z)
{
Reporter.critical(new StackTrace(z));
throw z;
}
catch(Exception e)
{
Reporter.critical(new StackTrace(e));
throw new ZipFileException(e);
}
| private static void | usage()
System.out.println("usage: java com.elf.util.zip.ZipWriter zip-filename directory-name");
System.exit(1);
| public void | write()
try
{
for(int i = 0; i < items.length; i++)
{
addEntry(items[i]);
}
zipStream.close();
}
catch(ZipFileException z)
{
Reporter.critical(new StackTrace(z));
throw z;
}
catch(Exception e)
{
Reporter.critical(new StackTrace(e));
throw new ZipFileException(e);
}
|
|