⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 poifsfilesystem.java

📁 Office格式转换代码
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/* ==================================================================== * 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 + -