Class NPOIFSFileSystem
- All Implemented Interfaces:
Closeable,AutoCloseable,POIFSViewable
- Direct Known Subclasses:
POIFSFileSystem
This is the main class of the POIFS system; it manages the entire life cycle of the filesystem.
This is the new NIO version, which uses less memory
-
Nested Class Summary
Nested classes/interfaces inherited from class org.docx4j.org.apache.poi.poifs.filesystem.BlockStore
BlockStore.ChainLoopDetector -
Constructor Summary
ConstructorsConstructorDescriptionConstructor, intended for writingNPOIFSFileSystem(File file) Creates a POIFSFileSystem from a File.NPOIFSFileSystem(File file, boolean readOnly) Creates a POIFSFileSystem from a File.NPOIFSFileSystem(InputStream stream) Create a POIFSFileSystem from an InputStream.NPOIFSFileSystem(FileChannel channel) Creates a POIFSFileSystem from an open FileChannel.NPOIFSFileSystem(FileChannel channel, boolean readOnly) Creates a POIFSFileSystem from an open FileChannel. -
Method Summary
Modifier and TypeMethodDescriptionvoidclose()Closes the FileSystem, freeing any underlying files, streams and buffers.protected ByteBuffercreateBlockIfNeeded(int offset) Load the block at the given offset, extending the file if neededcreateDirectory(String name) create a new DirectoryEntry in the root directorycreateDocument(InputStream stream, String name) Create a new document to be added to the root directorycreateDocument(String name, int size, POIFSWriterListener writer) create a new DocumentEntry in the root entry; the data will be provided latercreateDocumentInputStream(String documentName) open a document in the root entry's list of entriesstatic InputStreamConvenience method for clients that want to avoid the auto-close behaviour of the constructor.protected BATBlock.BATBlockAndIndexgetBATBlockAndIndex(int offset) Returns the BATBlock that handles the specified offset, and the relative index within itintprotected ByteBuffergetBlockAt(int offset) Load the block at the given offset.protected intReturns the size of the blocks managed through the block store.protected BlockStore.ChainLoopDetectorCreates a Detector for loops in the chainprotected intFinds a free block, and returns its offset.Returns the MiniStore, which performs a similar low level function to this, except for the small blocks.protected intgetNextBlock(int offset) Works out what block follows the specified one.getRoot()Get the root entryProvides a short description of the object, to be used when a POIFSViewable object has not provided its contents.Object[]Get an array of objects, some of which may implement POIFSViewableGet an Iterator of objects, some of which may implement POIFSViewablestatic booleanhasPOIFSHeader(byte[] header8Bytes) Checks if the supplied first 8 bytes of a stream / file has a POIFS (OLE2) header.static booleanChecks that the supplied InputStream (which MUST support mark and reset, or be a PushbackInputStream) has a POIFS (OLE2) header at the start of it.static voidread in a file and write it back out againbooleanGive viewers a hint as to whether to call getViewableArray or getViewableIteratorprotected voidsetNextBlock(int offset, int nextBlock) Changes the record of what block follows the specified one.protected longsize()voidWrite the filesystem out to the open file.voidwriteFilesystem(OutputStream stream) Write the filesystem out
-
Constructor Details
-
NPOIFSFileSystem
public NPOIFSFileSystem()Constructor, intended for writing -
NPOIFSFileSystem
Creates a POIFSFileSystem from a File. This uses less memory than creating from an InputStream. The File will be opened read-only
Note that with this constructor, you will need to call
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.- Parameters:
file- the File from which to read the data- Throws:
IOException- on errors reading, or on invalid data
-
NPOIFSFileSystem
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
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.- Parameters:
file- the File from which to read or read/write the datareadOnly- whether the POIFileSystem will only be used in read-only mode- Throws:
IOException- on errors reading, or on invalid data
-
NPOIFSFileSystem
Creates a POIFSFileSystem from an open FileChannel. This uses less memory than creating from an InputStream. The stream will be used in read-only mode.
Note that with this constructor, you will need to call
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.- Parameters:
channel- the FileChannel from which to read the data- Throws:
IOException- on errors reading, or on invalid data
-
NPOIFSFileSystem
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
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.- Parameters:
channel- the FileChannel from which to read or read/write the datareadOnly- whether the POIFileSystem will only be used in read-only mode- Throws:
IOException- on errors reading, or on invalid data
-
NPOIFSFileSystem
Create a POIFSFileSystem from an InputStream. Normally the stream is read until EOF. The stream is always closed. Some streams are usable after reaching EOF (typically those that returntruefor markSupported()). In the unlikely case that the caller has such a stream and needs to use it after this constructor completes, a work around is to wrap the stream in order to trap the close() call. A convenience method ( createNonClosingInputStream()) has been provided for this purpose:InputStream wrappedStream = POIFSFileSystem.createNonClosingInputStream(is); HSSFWorkbook wb = new HSSFWorkbook(wrappedStream); is.reset(); doSomethingElse(is);
Note also the special case of ByteArrayInputStream for which the close() method does nothing.ByteArrayInputStream bais = ... HSSFWorkbook wb = new HSSFWorkbook(bais); // calls bais.close() ! bais.reset(); // no problem doSomethingElse(bais);
- Parameters:
stream- the InputStream from which to read the data- Throws:
IOException- on errors reading, or on invalid data
-
-
Method Details
-
createNonClosingInputStream
Convenience method for clients that want to avoid the auto-close behaviour of the constructor. -
hasPOIFSHeader
Checks that the supplied InputStream (which MUST support mark and reset, or be a PushbackInputStream) has a POIFS (OLE2) header at the start of it. If your InputStream does not support mark / reset, then wrap it in a PushBackInputStream, then be sure to always use that, and not the original!- Parameters:
inp- An InputStream which supports either mark/reset, or is a PushbackInputStream- Throws:
IOException
-
hasPOIFSHeader
public static boolean hasPOIFSHeader(byte[] header8Bytes) Checks if the supplied first 8 bytes of a stream / file has a POIFS (OLE2) header. -
getBlockAt
Load the block at the given offset.- Specified by:
getBlockAtin classBlockStore- Throws:
IOException
-
createBlockIfNeeded
Load the block at the given offset, extending the file if needed- Specified by:
createBlockIfNeededin classBlockStore- Throws:
IOException
-
getBATBlockAndIndex
Returns the BATBlock that handles the specified offset, and the relative index within it- Specified by:
getBATBlockAndIndexin classBlockStore
-
getNextBlock
protected int getNextBlock(int offset) Works out what block follows the specified one.- Specified by:
getNextBlockin classBlockStore
-
setNextBlock
protected void setNextBlock(int offset, int nextBlock) Changes the record of what block follows the specified one.- Specified by:
setNextBlockin classBlockStore
-
getFreeBlock
Finds a free block, and returns its offset. This method will extend the file if needed, and if doing so, allocate new FAT blocks to address the extra space.- Specified by:
getFreeBlockin classBlockStore- Throws:
IOException
-
size
- Throws:
IOException
-
getChainLoopDetector
Description copied from class:BlockStoreCreates a Detector for loops in the chain- Specified by:
getChainLoopDetectorin classBlockStore- Throws:
IOException
-
getMiniStore
Returns the MiniStore, which performs a similar low level function to this, except for the small blocks. -
createDocument
Create a new document to be added to the root directory- Parameters:
stream- the InputStream from which the document's data will be obtainedname- the name of the new POIFSDocument- Returns:
- the new DocumentEntry
- Throws:
IOException- on error creating the new POIFSDocument
-
createDocument
public DocumentEntry createDocument(String name, int size, POIFSWriterListener writer) throws IOException create a new DocumentEntry in the root entry; the data will be provided later- Parameters:
name- the name of the new DocumentEntrysize- the size of the new DocumentEntrywriter- the writer of the new DocumentEntry- Returns:
- the new DocumentEntry
- Throws:
IOException
-
createDirectory
create a new DirectoryEntry in the root directory- Parameters:
name- the name of the new DirectoryEntry- Returns:
- the new DirectoryEntry
- Throws:
IOException- on name duplication
-
writeFilesystem
Write the filesystem out to the open file. Will thrown anIllegalArgumentExceptionif opened from anInputStream.- Throws:
IOException- thrown on errors writing to the stream
-
writeFilesystem
Write the filesystem out- Parameters:
stream- the OutputStream to which the filesystem will be written- Throws:
IOException- thrown on errors writing to the stream
-
close
Closes the FileSystem, freeing any underlying files, streams and buffers. After this, you will be unable to read or write from the FileSystem.- Specified by:
closein interfaceAutoCloseable- Specified by:
closein interfaceCloseable- Throws:
IOException
-
main
read in a file and write it back out again- Parameters:
args- names of the files; arg[ 0 ] is the input file, arg[ 1 ] is the output file- Throws:
IOException
-
getRoot
Get the root entry- Returns:
- the root entry
-
createDocumentInputStream
open a document in the root entry's list of entries- Parameters:
documentName- the name of the document to be opened- Returns:
- a newly opened DocumentInputStream
- Throws:
IOException- if the document does not exist or the name is that of a DirectoryEntry
-
getViewableArray
Get an array of objects, some of which may implement POIFSViewable- Specified by:
getViewableArrayin interfacePOIFSViewable- Returns:
- an array of Object; may not be null, but may be empty
-
getViewableIterator
Get an Iterator of objects, some of which may implement POIFSViewable- Specified by:
getViewableIteratorin interfacePOIFSViewable- Returns:
- an Iterator; may not be null, but may have an empty back end store
-
preferArray
public boolean preferArray()Give viewers a hint as to whether to call getViewableArray or getViewableIterator- Specified by:
preferArrayin interfacePOIFSViewable- Returns:
- true if a viewer should call getViewableArray, false if a viewer should call getViewableIterator
-
getShortDescription
Provides a short description of the object, to be used when a POIFSViewable object has not provided its contents.- Specified by:
getShortDescriptionin interfacePOIFSViewable- Returns:
- short description
-
getBigBlockSize
public int getBigBlockSize()- Returns:
- The Big Block size, normally 512 bytes, sometimes 4096 bytes
-
getBigBlockSizeDetails
- Returns:
- The Big Block size, normally 512 bytes, sometimes 4096 bytes
-
getBlockStoreBlockSize
protected int getBlockStoreBlockSize()Description copied from class:BlockStoreReturns the size of the blocks managed through the block store.- Specified by:
getBlockStoreBlockSizein classBlockStore
-