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

📄 propertyset.java

📁 Office格式转换代码
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
     *     * @param stream The byte array holding the stream data. The     * complete byte array contents is the stream data.     * @throws NoPropertySetStreamException if the byte array is not a     * property set stream.     */    public PropertySet(final byte[] stream) throws NoPropertySetStreamException    {        this(stream, 0, stream.length);    }    /**     * <p>Checks whether an {@link InputStream} is in the Horrible     * Property Set Format.</p>     *     * @param stream The {@link InputStream} to check. In order to     * perform the check, the method reads the first bytes from the     * stream. After reading, the stream is reset to the position it     * had before reading. The {@link InputStream} must support the     * {@link InputStream#mark} method.     * @return <code>true</code> if the stream is a property set     * stream, else <code>false</code>.     * @throws MarkUnsupportedException if the {@link InputStream}     * does not support the {@link InputStream#mark} method.     */    public static boolean isPropertySetStream(final InputStream stream)	throws MarkUnsupportedException, IOException    {        /*         * Read at most this many bytes.         */        final int BUFFER_SIZE = 50;        /*         * Mark the current position in the stream so that we can         * reset to this position if the stream does not contain a         * property set.         */        if (!stream.markSupported())            throw new MarkUnsupportedException(stream.getClass().getName());	stream.mark(BUFFER_SIZE);        /*         * Read a couple of bytes from the stream.         */        final byte[] buffer = new byte[BUFFER_SIZE];        final int bytes =	    stream.read(buffer, 0,			Math.min(buffer.length, stream.available()));        final boolean isPropertySetStream =	    isPropertySetStream(buffer, 0, bytes);        stream.reset();        return isPropertySetStream;    }    /**     * <p>Checks whether a byte array is in the Horrible Property Set     * Format.</p>     *     * @param src The byte array to check.     * @param offset The offset in the byte array.     * @param length The significant number of bytes in the byte     * array. Only this number of bytes will be checked.     * @return <code>true</code> if the byte array is a property set     * stream, <code>false</code> if not.     */    public static boolean isPropertySetStream(final byte[] src, int offset,					      final int length)    {        /*         * Read the header fields of the stream. They must always be         * there.         */        final int byteOrder = LittleEndian.getUShort(src, offset);        offset += LittleEndian.SHORT_SIZE;        byte[] temp = new byte[LittleEndian.SHORT_SIZE];        LittleEndian.putShort(temp,(short)byteOrder);        if (!Util.equal(temp, BYTE_ORDER_ASSERTION))            return false;	final int format = LittleEndian.getUShort(src, offset);        offset += LittleEndian.SHORT_SIZE;        temp = new byte[LittleEndian.SHORT_SIZE];        LittleEndian.putShort(temp,(short)format);        if (!Util.equal(temp, FORMAT_ASSERTION))            return false;	final long osVersion = LittleEndian.getUInt(src, offset);        offset += LittleEndian.INT_SIZE;        final ClassID classID = new ClassID(src, offset);        offset += ClassID.LENGTH;        final long sectionCount = LittleEndian.getUInt(src, offset);        offset += LittleEndian.INT_SIZE;        if (sectionCount < 1)            return false;	return true;    }    /**     * <p>Initializes this {@link PropertySet} instance from a byte     * array. The method assumes that it has been checked already that     * the byte array indeed represents a property set stream. It does     * no more checks on its own.</p>     *     * @param src Byte array containing the property set stream     * @param offset The property set stream starts at this offset     * from the beginning of <var>src</src>     * @param length Length of the property set stream.     */    private void init(final byte[] src, int offset, final int length)    {        /*         * Read the stream's header fields.         */        byteOrder = LittleEndian.getUShort(src, offset);        offset += LittleEndian.SHORT_SIZE;        format = LittleEndian.getUShort(src, offset);        offset += LittleEndian.SHORT_SIZE;        osVersion = (int) LittleEndian.getUInt(src, offset);        offset += LittleEndian.INT_SIZE;        classID = new ClassID(src, offset);        offset += ClassID.LENGTH;        sectionCount = LittleEndian.getInt(src, offset);        offset += LittleEndian.INT_SIZE;	if (sectionCount <= 0)	    throw new HPSFRuntimeException("Section count " + sectionCount +					   " must be greater than 0.");        /*         * Read the sections, which are following the header. They         * start with an array of section descriptions. Each one         * consists of a format ID telling what the section contains         * and an offset telling how many bytes from the start of the         * stream the section begins.         */        /*         * Most property sets have only one section. The Document         * Summary Information stream has 2. Everything else is a rare         * exception and is no longer fostered by Microsoft.         */        sections = new ArrayList(2);        /*         * Loop over the section descriptor array. Each descriptor         * consists of a ClassID and a DWord, and we have to increment         * "offset" accordingly.         */        for (int i = 0; i < sectionCount; i++)	{            final Section s = new Section(src, offset);            offset += ClassID.LENGTH + LittleEndian.INT_SIZE;            sections.add(s);        }    }    /**     * <p>Checks whether this {@link PropertySet} represents a Summary     * Information.</p>     *     * @return <code>true</code> if this {@link PropertySet}     * represents a Summary Information, else <code>false</code>.     */    public boolean isSummaryInformation()    {        return Util.equal(((Section) sections.get(0)).getFormatID().getBytes(),			  SectionIDMap.SUMMARY_INFORMATION_ID);    }    /**     * <p>Checks whether this {@link PropertySet} is a Document     * Summary Information.</p>     *     * @return <code>true</code> if this {@link PropertySet}     * represents a Document Summary Information, else <code>false</code>.     */    public boolean isDocumentSummaryInformation()    {        return Util.equal(((Section) sections.get(0)).getFormatID().getBytes(),			  SectionIDMap.DOCUMENT_SUMMARY_INFORMATION_ID);    }    /**     * <p>Convenience method returning the {@link Property} array     * contained in this property set. It is a shortcut for getting     * the {@link PropertySet}'s {@link Section}s list and then     * getting the {@link Property} array from the first {@link     * Section}. However, it can only be used if the {@link     * PropertySet} contains exactly one {@link Section}, so check     * {@link #getSectionCount} first!</p>     *     * @return The properties of the only {@link Section} of this     * {@link PropertySet}.     * @throws NoSingleSectionException if the {@link PropertySet} has     * more or less than one {@link Section}.     */    public Property[] getProperties()	throws NoSingleSectionException    {        return getSingleSection().getProperties();    }    /**     * <p>Convenience method returning the value of the property with     * the specified ID. If the property is not available,     * <code>null</code> is returned and a subsequent call to {@link     * #wasNull} will return <code>true</code> .</p>     *     * @param id The property ID     * @return The property value     * @throws NoSingleSectionException if the {@link PropertySet} has     * more or less than one {@link Section}.     */    protected Object getProperty(final int id) throws NoSingleSectionException    {        return getSingleSection().getProperty(id);    }    /**     * <p>Convenience method returning the value of a boolean property     * with the specified ID. If the property is not available,     * <code>false</code> is returned. A subsequent call to {@link     * #wasNull} will return <code>true</code> to let the caller     * distinguish that case from a real property value of     * <code>false</code>.</p>     *     * @param id The property ID     * @return The property value     * @throws NoSingleSectionException if the {@link PropertySet} has     * more or less than one {@link Section}.     */    protected boolean getPropertyBooleanValue(final int id)	throws NoSingleSectionException    {        return getSingleSection().getPropertyBooleanValue(id);    }    /**     * <p>Convenience method returning the value of the numeric     * property with the specified ID. If the property is not     * available, 0 is returned. A subsequent call to {@link #wasNull}     * will return <code>true</code> to let the caller distinguish     * that case from a real property value of 0.</p>     *     * @param id The property ID     * @return The propertyIntValue value     * @throws NoSingleSectionException if the {@link PropertySet} has     * more or less than one {@link Section}.     */    protected int getPropertyIntValue(final int id)	throws NoSingleSectionException    {        return getSingleSection().getPropertyIntValue(id);    }    /**     * <p>Checks whether the property which the last call to {@link     * #getPropertyIntValue} or {@link #getProperty} tried to access     * was available or not. This information might be important for     * callers of {@link #getPropertyIntValue} since the latter     * returns 0 if the property does not exist. Using {@link     * #wasNull}, the caller can distiguish this case from a     * property's real value of 0.</p>     *     * @return <code>true</code> if the last call to {@link     * #getPropertyIntValue} or {@link #getProperty} tried to access a     * property that was not available, else <code>false</code>.     * @throws NoSingleSectionException if the {@link PropertySet} has     * more than one {@link Section}.     */    public boolean wasNull() throws NoSingleSectionException    {        return getSingleSection().wasNull();    }    /**     * <p>If the {@link PropertySet} has only a single section this     * method returns it.</p>     *     *@return The singleSection value     *@throws NoSingleSectionException if the {@link PropertySet} has     *more or less than exactly one {@link Section}.     */    public Section getSingleSection()    {        if (sectionCount != 1)	    throw new NoSingleSectionException		("Property set contains " + sectionCount + " sections.");	return ((Section) sections.get(0));    }}

⌨️ 快捷键说明

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