📄 poifsfilesystem.java
字号:
/* ==================================================================== * The Apache Software License, Version 1.1 * * Copyright (c) 2003 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Apache" and "Apache Software Foundation" and * "Apache POI" must not be used to endorse or promote products * derived from this software without prior written permission. For * written permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache", * "Apache POI", nor may "Apache" appear in their name, without * prior written permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */package org.apache.poi.poifs.filesystem;import java.io.*;import java.util.*;import org.apache.poi.poifs.common.POIFSConstants;import org.apache.poi.poifs.dev.POIFSViewable;import org.apache.poi.poifs.property.DirectoryProperty;import org.apache.poi.poifs.property.DocumentProperty;import org.apache.poi.poifs.property.Property;import org.apache.poi.poifs.property.PropertyTable;import org.apache.poi.poifs.storage.BATBlock;import org.apache.poi.poifs.storage.BlockAllocationTableReader;import org.apache.poi.poifs.storage.BlockAllocationTableWriter;import org.apache.poi.poifs.storage.BlockList;import org.apache.poi.poifs.storage.BlockWritable;import org.apache.poi.poifs.storage.HeaderBlockReader;import org.apache.poi.poifs.storage.HeaderBlockWriter;import org.apache.poi.poifs.storage.RawDataBlock;import org.apache.poi.poifs.storage.RawDataBlockList;import org.apache.poi.poifs.storage.SmallBlockTableReader;import org.apache.poi.poifs.storage.SmallBlockTableWriter;import org.apache.poi.poifs.storage.SmallDocumentBlock;/** * This is the main class of the POIFS system; it manages the entire * life cycle of the filesystem. * * @author Marc Johnson (mjohnson at apache dot org) */public class POIFSFileSystem implements POIFSViewable{ private PropertyTable _property_table; private List _documents; private DirectoryNode _root; /** * Constructor, intended for writing */ public POIFSFileSystem() { _property_table = new PropertyTable(); _documents = new ArrayList(); _root = null; } /** * Create a POIFSFileSystem from an InputStream * * @param stream the InputStream from which to read the data * * @exception IOException on errors reading, or on invalid data */ public POIFSFileSystem(final InputStream stream) throws IOException { this(); // read the header block from the stream HeaderBlockReader header_block_reader = new HeaderBlockReader(stream); // read the rest of the stream into blocks RawDataBlockList data_blocks = new RawDataBlockList(stream); // set up the block allocation table (necessary for the // data_blocks to be manageable new BlockAllocationTableReader(header_block_reader.getBATCount(), header_block_reader.getBATArray(), header_block_reader.getXBATCount(), header_block_reader.getXBATIndex(), data_blocks); // get property table from the document PropertyTable properties = new PropertyTable(header_block_reader.getPropertyStart(), data_blocks); // init documents processProperties(SmallBlockTableReader .getSmallDocumentBlocks(data_blocks, properties .getRoot(), header_block_reader .getSBATStart()), data_blocks, properties.getRoot() .getChildren(), null); } /** * Create a new document to be added to the root directory * * @param stream the InputStream from which the document's data * will be obtained * @param name the name of the new POIFSDocument * * @return the new DocumentEntry * * @exception IOException on error creating the new POIFSDocument */ public DocumentEntry createDocument(final InputStream stream, final String name) throws IOException { return getRoot().createDocument(name, stream); } /** * create a new DocumentEntry in the root entry; the data will be * provided later * * @param name the name of the new DocumentEntry * @param size the size of the new DocumentEntry * @param writer the writer of the new DocumentEntry * * @return the new DocumentEntry * * @exception IOException */ public DocumentEntry createDocument(final String name, final int size, final POIFSWriterListener writer) throws IOException { return getRoot().createDocument(name, size, writer); } /** * create a new DirectoryEntry in the root directory * * @param name the name of the new DirectoryEntry * * @return the new DirectoryEntry * * @exception IOException on name duplication */ public DirectoryEntry createDirectory(final String name) throws IOException { return getRoot().createDirectory(name); } /** * Write the filesystem out * * @param stream the OutputStream to which the filesystem will be * written * * @exception IOException thrown on errors writing to the stream */ public void writeFilesystem(final OutputStream stream) throws IOException { // get the property table ready _property_table.preWrite(); // create the small block store, and the SBAT SmallBlockTableWriter sbtw = new SmallBlockTableWriter(_documents, _property_table.getRoot()); // create the block allocation table BlockAllocationTableWriter bat = new BlockAllocationTableWriter(); // create a list of BATManaged objects: the documents plus the // property table and the small block table List bm_objects = new ArrayList(); bm_objects.addAll(_documents); bm_objects.add(_property_table); bm_objects.add(sbtw); bm_objects.add(sbtw.getSBAT()); // walk the list, allocating space for each and assigning each // a starting block number Iterator iter = bm_objects.iterator(); while (iter.hasNext()) { BATManaged bmo = ( BATManaged ) iter.next(); int block_count = bmo.countBlocks(); if (block_count != 0) { bmo.setStartBlock(bat.allocateSpace(block_count)); } else { // Either the BATManaged object is empty or its data // is composed of SmallBlocks; in either case, // allocating space in the BAT is inappropriate } } // allocate space for the block allocation table and take its // starting block int batStartBlock = bat.createBlocks(); // get the extended block allocation table blocks HeaderBlockWriter header_block_writer = new HeaderBlockWriter(); BATBlock[] xbat_blocks = header_block_writer.setBATBlocks(bat.countBlocks(),
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -