我有点困惑。我知道空拉链是不合法的。但是下面的示例片段如何呢:
ZipOutputStream zos = null;
try
{
zos = new ZipOutputStream(new FileOutputStream("..."));
//
//..
//
}
finally
{
zos.close();
}如果由于某种原因(可能是异常情况)没有添加zip条目,则在尝试关闭时将抛出以下异常:
Exception in thread "main" java.util.zip.ZipException: ZIP file must have at least one entry
at java.util.zip.ZipOutputStream.finish(ZipOutputStream.java:304)
at java.util.zip.DeflaterOutputStream.close(DeflaterOutputStream.java:146)
at java.util.zip.ZipOutputStream.close(ZipOutputStream.java:321)在这种情况下,关闭流的最干净的方法是什么?
谢谢..。
发布于 2011-01-13 23:14:30
您应该关闭FileOutputStream,而不是ZipOutputStream,因为前者实际消耗系统资源。
File zipFile = new File("/tmp/example.zip");
FileOutputStream fos = null;
try
{
fos = new FileOutputStream(zipFile);
ZipOutputStream zos = new ZipOutputStream(fos);
// ...
zos.close();
}
catch (IOException ex)
{
// log/report exception, then delete the invalid file
IOUtils.closeQuietly(fos);
zipFile.delete();
}
finally
{
IOUtils.closeQuietly(fos);
}在Jakarta Commons IO中可以找到IOUtils类。使用它意味着您不必处理close()可能抛出的可能但很少有用的IOException。
发布于 2011-01-13 23:08:32
你应该跟踪是否在zip流中添加了内容,并仅在添加内容时才将其关闭:
ZipOutputStream zos = null;
OutputStream file = new FileOutputStream("...")
int itemsAdded=0;
try
{
zos = new ZipOutputStream(file);
//
//..
// itemsAdded++;
}
finally
{
if ( itemsAdded > 0 ) {
zos.close();
} else {
file.close();
}
}如果不需要计数,只需使用boolean标志即可。
发布于 2012-05-17 11:13:43
我所做的不是仅在添加内容时关闭流,而是在运行邮政编码之前进行条件检查,以查看是否有要压缩的内容。这帮助我简化了过程,我认为一般可以用来处理"ZIP文件必须至少有一个条目“的问题。确实,关闭zos可能会抛出其他异常,但这种情况很少见。
我认为这是Java的问题,当没有文件需要压缩时,Java不能处理这种情况。
即:
int itemsToAdd=0;
//....
if ( itemsToAdd > 0 ) {
ZipOutputStream zos = new ZipOutputStream(file);
try {
//add files to zip
}
finally {
zos.close();
}
}https://stackoverflow.com/questions/4681459
复制相似问题