| /* |
| ********************************************************************** |
| * Copyright (c) 2002-2010, International Business Machines |
| * Corporation and others. All Rights Reserved. |
| ********************************************************************** |
| * Author: Alan Liu |
| * Created: November 5 2002 |
| * Since: ICU 2.4 |
| ********************************************************************** |
| */ |
| package com.ibm.icu.impl; |
| |
| import java.io.ByteArrayInputStream; |
| import java.io.DataInputStream; |
| import java.io.IOException; |
| import java.io.InputStream; |
| |
| /** |
| * A DataInputStream that implements random-access seeking. For this |
| * to work, the size of the data stream must be known in advance, or |
| * the data must be supplied as a raw byte[] array. |
| * |
| * Seeking doesn't work directly on all streams. If a given stream |
| * doesn't support seeking, extract the bytes into a byte[] array and |
| * use the byte[] constructor. |
| */ |
| class ICUBinaryStream extends DataInputStream { |
| |
| /** |
| * Construct a stream from the given stream and size. |
| * @param stream the stream of data |
| * @param size the number of bytes that should be made available |
| * for seeking. Bytes beyond this may be read, but seeking will |
| * not work for offset >= size. |
| */ |
| public ICUBinaryStream(InputStream stream, int size) { |
| super(stream); |
| mark(size); |
| } |
| |
| /** |
| * Construct a stream from the given raw bytes. |
| */ |
| public ICUBinaryStream(byte[] raw) { |
| this(new ByteArrayInputStream(raw), raw.length); |
| } |
| |
| /** |
| * Seek to the given offset. Offset is from the position of the |
| * stream passed to the constructor, or from the start of the |
| * byte[] array. |
| */ |
| public void seek(int offset) throws IOException { |
| reset(); |
| int actual = skipBytes(offset); |
| if (actual != offset) { |
| throw new IllegalStateException("Skip(" + offset + ") only skipped " + |
| actual + " bytes"); |
| } |
| } |
| } |