Partial fix for #56537 - Have Workbook offer a close() method, which in turn closes the NPOIFS or OPC resource from which it was loaded
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1601901 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
1bcf519c7c
commit
47a8f6cf48
@ -48,7 +48,19 @@ import org.apache.poi.hssf.model.HSSFFormulaParser;
|
|||||||
import org.apache.poi.hssf.model.InternalSheet;
|
import org.apache.poi.hssf.model.InternalSheet;
|
||||||
import org.apache.poi.hssf.model.InternalWorkbook;
|
import org.apache.poi.hssf.model.InternalWorkbook;
|
||||||
import org.apache.poi.hssf.model.RecordStream;
|
import org.apache.poi.hssf.model.RecordStream;
|
||||||
import org.apache.poi.hssf.record.*;
|
import org.apache.poi.hssf.record.AbstractEscherHolderRecord;
|
||||||
|
import org.apache.poi.hssf.record.BackupRecord;
|
||||||
|
import org.apache.poi.hssf.record.DrawingGroupRecord;
|
||||||
|
import org.apache.poi.hssf.record.ExtendedFormatRecord;
|
||||||
|
import org.apache.poi.hssf.record.FontRecord;
|
||||||
|
import org.apache.poi.hssf.record.LabelRecord;
|
||||||
|
import org.apache.poi.hssf.record.LabelSSTRecord;
|
||||||
|
import org.apache.poi.hssf.record.NameRecord;
|
||||||
|
import org.apache.poi.hssf.record.RecalcIdRecord;
|
||||||
|
import org.apache.poi.hssf.record.Record;
|
||||||
|
import org.apache.poi.hssf.record.RecordFactory;
|
||||||
|
import org.apache.poi.hssf.record.SSTRecord;
|
||||||
|
import org.apache.poi.hssf.record.UnknownRecord;
|
||||||
import org.apache.poi.hssf.record.aggregates.RecordAggregate.RecordVisitor;
|
import org.apache.poi.hssf.record.aggregates.RecordAggregate.RecordVisitor;
|
||||||
import org.apache.poi.hssf.record.common.UnicodeString;
|
import org.apache.poi.hssf.record.common.UnicodeString;
|
||||||
import org.apache.poi.hssf.util.CellReference;
|
import org.apache.poi.hssf.util.CellReference;
|
||||||
@ -56,6 +68,7 @@ import org.apache.poi.poifs.filesystem.DirectoryEntry;
|
|||||||
import org.apache.poi.poifs.filesystem.DirectoryNode;
|
import org.apache.poi.poifs.filesystem.DirectoryNode;
|
||||||
import org.apache.poi.poifs.filesystem.EntryUtils;
|
import org.apache.poi.poifs.filesystem.EntryUtils;
|
||||||
import org.apache.poi.poifs.filesystem.FilteringDirectoryNode;
|
import org.apache.poi.poifs.filesystem.FilteringDirectoryNode;
|
||||||
|
import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
|
||||||
import org.apache.poi.poifs.filesystem.Ole10Native;
|
import org.apache.poi.poifs.filesystem.Ole10Native;
|
||||||
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
|
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
|
||||||
import org.apache.poi.ss.formula.FormulaShifter;
|
import org.apache.poi.ss.formula.FormulaShifter;
|
||||||
@ -1178,6 +1191,22 @@ public final class HSSFWorkbook extends POIDocument implements org.apache.poi.ss
|
|||||||
|
|
||||||
return style;
|
return style;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Closes the underlying {@link NPOIFSFileSystem} from which
|
||||||
|
* the Workbook was read, if any. Has no effect on Workbooks
|
||||||
|
* opened from an InputStream, or newly created ones.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void close() throws IOException
|
||||||
|
{
|
||||||
|
if (directory != null) {
|
||||||
|
if (directory.getNFileSystem() != null) {
|
||||||
|
directory.getNFileSystem().close();
|
||||||
|
directory = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Method write - write out this workbook to an Outputstream. Constructs
|
* Method write - write out this workbook to an Outputstream. Constructs
|
||||||
@ -1189,7 +1218,6 @@ public final class HSSFWorkbook extends POIDocument implements org.apache.poi.ss
|
|||||||
* @exception IOException if anything can't be written.
|
* @exception IOException if anything can't be written.
|
||||||
* @see org.apache.poi.poifs.filesystem.POIFSFileSystem
|
* @see org.apache.poi.poifs.filesystem.POIFSFileSystem
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void write(OutputStream stream)
|
public void write(OutputStream stream)
|
||||||
throws IOException
|
throws IOException
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
|
|
||||||
package org.apache.poi.ss.usermodel;
|
package org.apache.poi.ss.usermodel;
|
||||||
|
|
||||||
|
import java.io.Closeable;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -30,7 +31,7 @@ import org.apache.poi.ss.util.CellRangeAddress;
|
|||||||
* will construct whether they are reading or writing a workbook. It is also the
|
* will construct whether they are reading or writing a workbook. It is also the
|
||||||
* top level object for creating new sheets/etc.
|
* top level object for creating new sheets/etc.
|
||||||
*/
|
*/
|
||||||
public interface Workbook {
|
public interface Workbook extends Closeable {
|
||||||
|
|
||||||
/** Extended windows meta file */
|
/** Extended windows meta file */
|
||||||
public static final int PICTURE_TYPE_EMF = 2;
|
public static final int PICTURE_TYPE_EMF = 2;
|
||||||
@ -350,6 +351,14 @@ public interface Workbook {
|
|||||||
*/
|
*/
|
||||||
void write(OutputStream stream) throws IOException;
|
void write(OutputStream stream) throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Close the underlying input resource (File or Stream),
|
||||||
|
* from which the Workbook was read. After closing, the
|
||||||
|
* Workbook should no longer be used.
|
||||||
|
* <p>This will have no effect newly created Workbooks.
|
||||||
|
*/
|
||||||
|
void close() throws IOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return the total number of defined names in this workbook
|
* @return the total number of defined names in this workbook
|
||||||
*/
|
*/
|
||||||
|
@ -29,6 +29,7 @@ import java.util.Set;
|
|||||||
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
|
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
|
||||||
import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
|
import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
|
||||||
import org.apache.poi.openxml4j.opc.OPCPackage;
|
import org.apache.poi.openxml4j.opc.OPCPackage;
|
||||||
|
import org.apache.poi.openxml4j.opc.PackageAccess;
|
||||||
import org.apache.poi.openxml4j.opc.PackagePart;
|
import org.apache.poi.openxml4j.opc.PackagePart;
|
||||||
import org.apache.poi.openxml4j.opc.PackageRelationship;
|
import org.apache.poi.openxml4j.opc.PackageRelationship;
|
||||||
import org.apache.poi.openxml4j.opc.PackageRelationshipCollection;
|
import org.apache.poi.openxml4j.opc.PackageRelationshipCollection;
|
||||||
@ -159,6 +160,21 @@ public abstract class POIXMLDocument extends POIXMLDocumentPart{
|
|||||||
onDocumentRead();
|
onDocumentRead();
|
||||||
context.clear();
|
context.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Closes the underlying {@link OPCPackage} from which this
|
||||||
|
* document was read, if there is one
|
||||||
|
*/
|
||||||
|
protected void close() throws IOException {
|
||||||
|
if (pkg != null) {
|
||||||
|
if (pkg.getPackageAccess() == PackageAccess.READ) {
|
||||||
|
pkg.revert();
|
||||||
|
} else {
|
||||||
|
pkg.close();
|
||||||
|
}
|
||||||
|
pkg = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Write out this document to an Outputstream.
|
* Write out this document to an Outputstream.
|
||||||
|
@ -199,10 +199,11 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable<X
|
|||||||
* Constructs a XSSFWorkbook object given a OpenXML4J <code>Package</code> object,
|
* Constructs a XSSFWorkbook object given a OpenXML4J <code>Package</code> object,
|
||||||
* see <a href="http://poi.apache.org/oxml4j/">http://poi.apache.org/oxml4j/</a>.
|
* see <a href="http://poi.apache.org/oxml4j/">http://poi.apache.org/oxml4j/</a>.
|
||||||
*
|
*
|
||||||
* Once you have finished working with the Workbook, you should close the package
|
* <p>Once you have finished working with the Workbook, you should close the package
|
||||||
* by calling pkg.close, to avoid leaving file handles open.
|
* by calling either {@link #close()} or {@link OPCPackage#close()}, to avoid
|
||||||
|
* leaving file handles open.
|
||||||
*
|
*
|
||||||
* Creating a XSSFWorkbook from a file-backed OPC Package has a lower memory
|
* <p>Creating a XSSFWorkbook from a file-backed OPC Package has a lower memory
|
||||||
* footprint than an InputStream backed one.
|
* footprint than an InputStream backed one.
|
||||||
*
|
*
|
||||||
* @param pkg the OpenXML4J <code>OPC Package</code> object.
|
* @param pkg the OpenXML4J <code>OPC Package</code> object.
|
||||||
@ -218,7 +219,7 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable<X
|
|||||||
* Constructs a XSSFWorkbook object, by buffering the whole stream into memory
|
* Constructs a XSSFWorkbook object, by buffering the whole stream into memory
|
||||||
* and then opening an {@link OPCPackage} object for it.
|
* and then opening an {@link OPCPackage} object for it.
|
||||||
*
|
*
|
||||||
* Using an {@link InputStream} requires more memory than using a File, so
|
* <p>Using an {@link InputStream} requires more memory than using a File, so
|
||||||
* if a {@link File} is available then you should instead do something like
|
* if a {@link File} is available then you should instead do something like
|
||||||
* <pre><code>
|
* <pre><code>
|
||||||
* OPCPackage pkg = OPCPackage.open(path);
|
* OPCPackage pkg = OPCPackage.open(path);
|
||||||
@ -1350,6 +1351,16 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable<X
|
|||||||
workbook.save(out, xmlOptions);
|
workbook.save(out, xmlOptions);
|
||||||
out.close();
|
out.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Closes the underlying {@link OPCPackage} from which
|
||||||
|
* the Workbook was read, if any. Has no effect on newly
|
||||||
|
* created Workbooks.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void close() throws IOException {
|
||||||
|
super.close();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns SharedStringsTable - tha cache of string for this workbook
|
* Returns SharedStringsTable - tha cache of string for this workbook
|
||||||
|
Loading…
Reference in New Issue
Block a user