poi-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From n...@apache.org
Subject svn commit: r1054033 - /poi/trunk/src/java/org/apache/poi/poifs/filesystem/NPOIFSFileSystem.java
Date Fri, 31 Dec 2010 00:46:00 GMT
Author: nick
Date: Fri Dec 31 00:46:00 2010
New Revision: 1054033

URL: http://svn.apache.org/viewvc?rev=1054033&view=rev
Log:
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

Modified:
    poi/trunk/src/java/org/apache/poi/poifs/filesystem/NPOIFSFileSystem.java

Modified: poi/trunk/src/java/org/apache/poi/poifs/filesystem/NPOIFSFileSystem.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/poifs/filesystem/NPOIFSFileSystem.java?rev=1054033&r1=1054032&r2=1054033&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/poifs/filesystem/NPOIFSFileSystem.java (original)
+++ poi/trunk/src/java/org/apache/poi/poifs/filesystem/NPOIFSFileSystem.java Fri Dec 31 00:46:00
2010
@@ -107,7 +107,7 @@ public class NPOIFSFileSystem extends Bl
 
     /**
      * Creates a POIFSFileSystem from a <tt>File</tt>. This uses less memory
than
-     *  creating from an <tt>InputStream</tt>.
+     *  creating from an <tt>InputStream</tt>. 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
@@ -120,21 +120,70 @@ public class NPOIFSFileSystem extends Bl
     public NPOIFSFileSystem(File file)
          throws IOException
     {
+       this(file, true);
+    }
+    
+    /**
+     * Creates a POIFSFileSystem from a <tt>File</tt>. This uses less memory
than
+     *  creating from an <tt>InputStream</tt>.
+     *  
+     * 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 <tt>FileChannel</tt>. This uses

+     *  less memory than creating from an <tt>InputStream</tt>.
+     *  
+     * 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;
+       }
     }
     
     /**



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org


Mime
View raw message