poifsfilesystem.java

来自「EXCEL read and write」· Java 代码 · 共 616 行 · 第 1/2 页

JAVA
616
字号
        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(),                                             batStartBlock);        // set the property table start block        header_block_writer.setPropertyStart(_property_table.getStartBlock());        // set the small block allocation table start block        header_block_writer.setSBATStart(sbtw.getSBAT().getStartBlock());        // set the small block allocation table block count        header_block_writer.setSBATBlockCount(sbtw.getSBATBlockCount());        // the header is now properly initialized. Make a list of        // writers (the header block, followed by the documents, the        // property table, the small block store, the small block        // allocation table, the block allocation table, and the        // extended block allocation table blocks)        List writers = new ArrayList();        writers.add(header_block_writer);        writers.addAll(_documents);        writers.add(_property_table);        writers.add(sbtw);        writers.add(sbtw.getSBAT());        writers.add(bat);        for (int j = 0; j < xbat_blocks.length; j++)        {            writers.add(xbat_blocks[ j ]);        }        // now, write everything out        iter = writers.iterator();        while (iter.hasNext())        {            BlockWritable writer = ( BlockWritable ) iter.next();            writer.writeBlocks(stream);        }    }    /**     * read in a file and write it back out again     *     * @param args names of the files; arg[ 0 ] is the input file,     *             arg[ 1 ] is the output file     *     * @exception IOException     */    public static void main(String args[])        throws IOException    {        if (args.length != 2)        {            System.err.println(                "two arguments required: input filename and output filename");            System.exit(1);        }        FileInputStream  istream = new FileInputStream(args[ 0 ]);        FileOutputStream ostream = new FileOutputStream(args[ 1 ]);        new POIFSFileSystem(istream).writeFilesystem(ostream);        istream.close();        ostream.close();    }    /**     * get the root entry     *     * @return the root entry     */    public DirectoryNode getRoot()    {        if (_root == null)        {            _root = new DirectoryNode(_property_table.getRoot(), this, null);        }        return _root;    }    /**     * open a document in the root entry's list of entries     *     * @param documentName the name of the document to be opened     *     * @return a newly opened DocumentInputStream     *     * @exception IOException if the document does not exist or the     *            name is that of a DirectoryEntry     */    public DocumentInputStream createDocumentInputStream(            final String documentName)        throws IOException    {    	return getRoot().createDocumentInputStream(documentName);    }    /**     * add a new POIFSDocument     *     * @param document the POIFSDocument being added     */    void addDocument(final POIFSDocument document)    {        _documents.add(document);        _property_table.addProperty(document.getDocumentProperty());    }    /**     * add a new DirectoryProperty     *     * @param directory the DirectoryProperty being added     */    void addDirectory(final DirectoryProperty directory)    {        _property_table.addProperty(directory);    }    /**     * remove an entry     *     * @param entry to be removed     */    void remove(EntryNode entry)    {        _property_table.removeProperty(entry.getProperty());        if (entry.isDocumentEntry())        {            _documents.remove((( DocumentNode ) entry).getDocument());        }    }    private void processProperties(final BlockList small_blocks,                                   final BlockList big_blocks,                                   final Iterator properties,                                   final DirectoryNode dir)        throws IOException    {        while (properties.hasNext())        {            Property      property = ( Property ) properties.next();            String        name     = property.getName();            DirectoryNode parent   = (dir == null)                                     ? (( DirectoryNode ) getRoot())                                     : dir;            if (property.isDirectory())            {                DirectoryNode new_dir =                    ( DirectoryNode ) parent.createDirectory(name);                new_dir.setStorageClsid( property.getStorageClsid() );                processProperties(                    small_blocks, big_blocks,                    (( DirectoryProperty ) property).getChildren(), new_dir);            }            else            {                int           startBlock = property.getStartBlock();                int           size       = property.getSize();                POIFSDocument document   = null;                if (property.shouldUseSmallBlocks())                {                    document =                        new POIFSDocument(name, small_blocks                            .fetchBlocks(startBlock), size);                }                else                {                    document =                        new POIFSDocument(name,                                          big_blocks.fetchBlocks(startBlock),                                          size);                }                parent.createDocument(document);            }        }    }    /* ********** START begin implementation of POIFSViewable ********** */    /**     * Get an array of objects, some of which may implement     * POIFSViewable     *     * @return an array of Object; may not be null, but may be empty     */    public Object [] getViewableArray()    {        if (preferArray())        {            return (( POIFSViewable ) getRoot()).getViewableArray();        }        else        {            return new Object[ 0 ];        }    }    /**     * Get an Iterator of objects, some of which may implement     * POIFSViewable     *     * @return an Iterator; may not be null, but may have an empty     * back end store     */    public Iterator getViewableIterator()    {        if (!preferArray())        {            return (( POIFSViewable ) getRoot()).getViewableIterator();        }        else        {            return Collections.EMPTY_LIST.iterator();        }    }    /**     * Give viewers a hint as to whether to call getViewableArray or     * getViewableIterator     *     * @return true if a viewer should call getViewableArray, false if     *         a viewer should call getViewableIterator     */    public boolean preferArray()    {        return (( POIFSViewable ) getRoot()).preferArray();    }    /**     * Provides a short description of the object, to be used when a     * POIFSViewable object has not provided its contents.     *     * @return short description     */    public String getShortDescription()    {        return "POIFS FileSystem";    }    /**     * @return The Big Block size, normally 512 bytes, sometimes 4096 bytes     */    public int getBigBlockSize() {    	return bigBlockSize;    }        /* **********  END  begin implementation of POIFSViewable ********** */}   // end public class POIFSFileSystem

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?