From: Nick Burch Date: Fri, 31 Dec 2010 00:46:00 +0000 (+0000) Subject: Tweak NPOIFS constructors so that if you have a FileChannel, you can pass it in,... X-Git-Tag: REL_3_8_BETA1~51 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=0057449df43074694fc343b252dfcb567c145ba9;p=poi.git Tweak NPOIFS constructors so that if you have a FileChannel, you can pass it in, but that the File based one will tidy up after itself in the event of errors git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1054033 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/java/org/apache/poi/poifs/filesystem/NPOIFSFileSystem.java b/src/java/org/apache/poi/poifs/filesystem/NPOIFSFileSystem.java index e671d870bb..ef3c5c712d 100644 --- a/src/java/org/apache/poi/poifs/filesystem/NPOIFSFileSystem.java +++ b/src/java/org/apache/poi/poifs/filesystem/NPOIFSFileSystem.java @@ -107,7 +107,7 @@ public class NPOIFSFileSystem extends BlockStore /** * Creates a POIFSFileSystem from a File. This uses less memory than - * creating from an InputStream. + * creating from an InputStream. The File will be opened read-only * * Note that with this constructor, you will need to call {@link #close()} * when you're done to have the underlying file closed, as the file is @@ -119,22 +119,71 @@ public class NPOIFSFileSystem extends BlockStore */ public NPOIFSFileSystem(File file) throws IOException + { + this(file, true); + } + + /** + * Creates a POIFSFileSystem from a File. This uses less memory than + * creating from an InputStream. + * + * Note that with this constructor, you will need to call {@link #close()} + * when you're done to have the underlying file closed, as the file is + * kept open during normal operation to read the data out. + * + * @param file the File from which to read the data + * + * @exception IOException on errors reading, or on invalid data + */ + public NPOIFSFileSystem(File file, boolean readOnly) + throws IOException + { + this( + (new RandomAccessFile(file, readOnly? "r" : "rw")).getChannel(), + true + ); + } + + /** + * Creates a POIFSFileSystem from an open FileChannel. This uses + * less memory than creating from an InputStream. + * + * Note that with this constructor, you will need to call {@link #close()} + * when you're done to have the underlying Channel closed, as the channel is + * kept open during normal operation to read the data out. + * + * @param channel the FileChannel from which to read the data + * + * @exception IOException on errors reading, or on invalid data + */ + public NPOIFSFileSystem(FileChannel channel) + throws IOException + { + this(channel, false); + } + + private NPOIFSFileSystem(FileChannel channel, boolean closeChannelOnError) + throws IOException { this(); - - // Open the underlying channel - FileChannel channel = (new RandomAccessFile(file, "r")).getChannel(); - - // Get the header - ByteBuffer headerBuffer = ByteBuffer.allocate(POIFSConstants.SMALLER_BIG_BLOCK_SIZE); - IOUtils.readFully(channel, headerBuffer); - - // Have the header processed - _header = new HeaderBlock(headerBuffer); - - // Now process the various entries - _data = new FileBackedDataSource(channel); - readCoreContents(); + + try { + // Get the header + ByteBuffer headerBuffer = ByteBuffer.allocate(POIFSConstants.SMALLER_BIG_BLOCK_SIZE); + IOUtils.readFully(channel, headerBuffer); + + // Have the header processed + _header = new HeaderBlock(headerBuffer); + + // Now process the various entries + _data = new FileBackedDataSource(channel); + readCoreContents(); + } catch(IOException e) { + if(closeChannelOnError) { + channel.close(); + } + throw e; + } } /**