1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  this work for additional information regarding copyright ownership.
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  the License.  You may obtain a copy of the License at
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  See the License for the specific language governing permissions and
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  limitations under the License.
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage java.io;
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.apache.harmony.luni.util.Msg;
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.apache.harmony.luni.util.Util;
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
243819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson * Wraps an existing {@link InputStream} and reads typed data from it.
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Typically, this stream has been written by a DataOutputStream. Types that can
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * be read include byte, 16-bit short, 32-bit int, 32-bit float, 64-bit long,
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 64-bit double, byte strings, and strings encoded in
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * {@link DataInput modified UTF-8}.
293819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson *
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see DataOutputStream
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class DataInputStream extends FilterInputStream implements DataInput {
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
343819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson    byte[] buff;
353819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Constructs a new DataInputStream on the InputStream {@code in}. All
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * reads are then filtered through this stream. Note that data read by this
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * stream is not in a human readable format and was most likely created by a
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * DataOutputStream.
413819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param in
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the source InputStream the filter reads from.
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see DataOutputStream
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see RandomAccessFile
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public DataInputStream(InputStream in) {
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        super(in);
493819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        buff = new byte[8];
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Reads bytes from this stream into the byte array {@code buffer}. Returns
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * the number of bytes that have been read.
553819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param buffer
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the buffer to read bytes into.
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the number of bytes that have been read or -1 if the end of the
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         stream has been reached.
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IOException
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if a problem occurs while reading from this stream.
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see DataOutput#write(byte[])
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see DataOutput#write(byte[], int, int)
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final int read(byte[] buffer) throws IOException {
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return in.read(buffer, 0, buffer.length);
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Reads at most {@code length} bytes from this stream and stores them in
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * the byte array {@code buffer} starting at {@code offset}. Returns the
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * number of bytes that have been read or -1 if no bytes have been read and
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * the end of the stream has been reached.
753819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param buffer
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the byte array in which to store the bytes read.
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param offset
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the initial position in {@code buffer} to store the bytes
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            read from this stream.
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param length
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the maximum number of bytes to store in {@code buffer}.
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the number of bytes that have been read or -1 if the end of the
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         stream has been reached.
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IOException
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if a problem occurs while reading from this stream.
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see DataOutput#write(byte[])
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see DataOutput#write(byte[], int, int)
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final int read(byte[] buffer, int offset, int length)
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throws IOException {
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return in.read(buffer, offset, length);
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Reads a boolean from this stream.
983819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the next boolean value from the source stream.
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws EOFException
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if the end of the filtered stream is reached before one byte
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             has been read.
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IOException
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if a problem occurs while reading from this stream.
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see DataOutput#writeBoolean(boolean)
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final boolean readBoolean() throws IOException {
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int temp = in.read();
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (temp < 0) {
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new EOFException();
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return temp != 0;
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Reads an 8-bit byte value from this stream.
1173819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the next byte value from the source stream.
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws EOFException
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if the end of the filtered stream is reached before one byte
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             has been read.
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IOException
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if a problem occurs while reading from this stream.
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see DataOutput#writeByte(int)
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final byte readByte() throws IOException {
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int temp = in.read();
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (temp < 0) {
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new EOFException();
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return (byte) temp;
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Reads a 16-bit character value from this stream.
1363819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the next char value from the source stream.
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws EOFException
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if the end of the filtered stream is reached before two bytes
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             have been read.
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IOException
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if a problem occurs while reading from this stream.
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see DataOutput#writeChar(int)
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final char readChar() throws IOException {
1463819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        if (readToBuff(2) < 0){
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new EOFException();
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1493819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        return (char) (((buff[0] & 0xff) << 8) | (buff[1] & 0xff));
1503819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson
1513819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson    }
1523819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson
1533819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson    private int readToBuff(int count) throws IOException {
1543819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        int offset = 0;
1553819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson
1563819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        while(offset < count) {
1573819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson            int bytesRead = in.read(buff, offset, count - offset);
1583819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson            if(bytesRead == -1) return bytesRead;
1593819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson            offset += bytesRead;
1603819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        }
1613819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        return offset;
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Reads a 64-bit double value from this stream.
1663819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the next double value from the source stream.
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws EOFException
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if the end of the filtered stream is reached before eight
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             bytes have been read.
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IOException
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if a problem occurs while reading from this stream.
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see DataOutput#writeDouble(double)
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final double readDouble() throws IOException {
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return Double.longBitsToDouble(readLong());
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Reads a 32-bit float value from this stream.
1813819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the next float value from the source stream.
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws EOFException
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if the end of the filtered stream is reached before four
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             bytes have been read.
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IOException
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if a problem occurs while reading from this stream.
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see DataOutput#writeFloat(float)
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final float readFloat() throws IOException {
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return Float.intBitsToFloat(readInt());
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Reads bytes from this stream into the byte array {@code buffer}. This
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * method will block until {@code buffer.length} number of bytes have been
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * read.
1983819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param buffer
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            to read bytes into.
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws EOFException
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if the end of the source stream is reached before enough
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             bytes have been read.
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IOException
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if a problem occurs while reading from this stream.
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see DataOutput#write(byte[])
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see DataOutput#write(byte[], int, int)
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final void readFully(byte[] buffer) throws IOException {
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        readFully(buffer, 0, buffer.length);
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Reads bytes from this stream and stores them in the byte array {@code
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * buffer} starting at the position {@code offset}. This method blocks until
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {@code length} bytes have been read. If {@code length} is zero, then this
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * method returns without reading any bytes.
2183819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param buffer
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the byte array into which the data is read.
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param offset
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the offset in {@code buffer} from where to store the bytes
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            read.
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param length
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the maximum number of bytes to read.
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws EOFException
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if the end of the source stream is reached before enough
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             bytes have been read.
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IndexOutOfBoundsException
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if {@code offset < 0} or {@code length < 0}, or if {@code
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             offset + length} is greater than the size of {@code buffer}.
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IOException
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if a problem occurs while reading from this stream.
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws NullPointerException
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if {@code buffer} or the source stream are null.
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see java.io.DataInput#readFully(byte[], int, int)
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final void readFully(byte[] buffer, int offset, int length)
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throws IOException {
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // BEGIN android-removed
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // if (length < 0) {
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        //     throw new IndexOutOfBoundsException();
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // }
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // END android-removed
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (length == 0) {
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return;
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (in == null) {
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new NullPointerException(Msg.getString("KA00b")); //$NON-NLS-1$
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (buffer == null) {
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new NullPointerException(Msg.getString("K0047")); //$NON-NLS-1$
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // BEGIN android-changed
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // Exception priorities (in case of multiple errors) differ from
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // RI, but are spec-compliant.
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // used (offset | length) < 0 instead of separate (offset < 0) and
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // (length < 0) check to safe one operation
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if ((offset | length) < 0 || offset > buffer.length - length) {
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IndexOutOfBoundsException(Msg.getString("K002f")); //$NON-NLS-1$
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // END android-changed
263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        while (length > 0) {
264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            int result = in.read(buffer, offset, length);
265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (result < 0) {
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                throw new EOFException();
267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            offset += result;
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            length -= result;
270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Reads a 32-bit integer value from this stream.
2753819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the next int value from the source stream.
277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws EOFException
278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if the end of the filtered stream is reached before four
279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             bytes have been read.
280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IOException
281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if a problem occurs while reading from this stream.
282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see DataOutput#writeInt(int)
283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final int readInt() throws IOException {
2853819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        if (readToBuff(4) < 0){
2863819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson            throw new EOFException();
287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2883819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        return ((buff[0] & 0xff) << 24) | ((buff[1] & 0xff) << 16) |
2893819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson            ((buff[2] & 0xff) << 8) | (buff[3] & 0xff);
290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns a string that contains the next line of text available from the
294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * source stream. A line is represented by zero or more characters followed
295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * by {@code '\n'}, {@code '\r'}, {@code "\r\n"} or the end of the stream.
296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The string does not include the newline sequence.
2973819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the contents of the line or {@code null} if no characters were
299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         read before the end of the source stream has been reached.
300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IOException
301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if a problem occurs while reading from this stream.
302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @deprecated Use {@link BufferedReader}
303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Deprecated
305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final String readLine() throws IOException {
30601021fcb0c9026e81ac2c262caf5e2ec830a7025Jesse Wilson        StringBuilder line = new StringBuilder(80); // Typical line length
307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        boolean foundTerminator = false;
308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        while (true) {
309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            int nextByte = in.read();
310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            switch (nextByte) {
311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                case -1:
312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    if (line.length() == 0 && !foundTerminator) {
313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        return null;
314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return line.toString();
316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                case (byte) '\r':
317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    if (foundTerminator) {
318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        ((PushbackInputStream) in).unread(nextByte);
319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        return line.toString();
320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    foundTerminator = true;
322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    /* Have to be able to peek ahead one byte */
323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    if (!(in.getClass() == PushbackInputStream.class)) {
324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        in = new PushbackInputStream(in);
325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    break;
327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                case (byte) '\n':
328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return line.toString();
329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                default:
330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    if (foundTerminator) {
331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        ((PushbackInputStream) in).unread(nextByte);
332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        return line.toString();
333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    line.append((char) nextByte);
335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Reads a 64-bit long value from this stream.
3413819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the next long value from the source stream.
343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws EOFException
344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if the end of the filtered stream is reached before eight
345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             bytes have been read.
346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IOException
347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if a problem occurs while reading from this stream.
348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see DataOutput#writeLong(long)
349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final long readLong() throws IOException {
3513819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        if (readToBuff(8) < 0){
352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new EOFException();
353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
3543819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        int i1 = ((buff[0] & 0xff) << 24) | ((buff[1] & 0xff) << 16) |
3553819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson            ((buff[2] & 0xff) << 8) | (buff[3] & 0xff);
3563819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        int i2 = ((buff[4] & 0xff) << 24) | ((buff[5] & 0xff) << 16) |
3573819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson            ((buff[6] & 0xff) << 8) | (buff[7] & 0xff);
3583819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson
3593819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        return ((i1 & 0xffffffffL) << 32) | (i2 & 0xffffffffL);
360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Reads a 16-bit short value from this stream.
3643819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the next short value from the source stream.
366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws EOFException
367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if the end of the filtered stream is reached before two bytes
368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             have been read.
369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IOException
370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if a problem occurs while reading from this stream.
371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see DataOutput#writeShort(int)
372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final short readShort() throws IOException {
3743819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        if (readToBuff(2) < 0){
3753819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson            throw new EOFException();
376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
3773819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        return (short) (((buff[0] & 0xff) << 8) | (buff[1] & 0xff));
378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Reads an unsigned 8-bit byte value from this stream and returns it as an
382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * int.
3833819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the next unsigned byte value from the source stream.
385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws EOFException
386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if the end of the filtered stream has been reached before one
387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             byte has been read.
388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IOException
389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if a problem occurs while reading from this stream.
390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see DataOutput#writeByte(int)
391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final int readUnsignedByte() throws IOException {
393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int temp = in.read();
394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (temp < 0) {
395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new EOFException();
396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return temp;
398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Reads a 16-bit unsigned short value from this stream and returns it as an
402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * int.
4033819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the next unsigned short value from the source stream.
405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws EOFException
406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if the end of the filtered stream is reached before two bytes
407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             have been read.
408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IOException
409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if a problem occurs while reading from this stream.
410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see DataOutput#writeShort(int)
411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final int readUnsignedShort() throws IOException {
4133819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        if (readToBuff(2) < 0){
414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new EOFException();
415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
4163819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        return (char) (((buff[0] & 0xff) << 8) | (buff[1] & 0xff));
417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Reads an string encoded in {@link DataInput modified UTF-8} from this
421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * stream.
4223819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the next {@link DataInput MUTF-8} encoded string read from the
424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         source stream.
425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws EOFException if the end of the input is reached before the read
426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         request can be satisfied.
427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IOException
428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if a problem occurs while reading from this stream.
429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see DataOutput#writeUTF(java.lang.String)
430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final String readUTF() throws IOException {
4323819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        return decodeUTF(readUnsignedShort());
433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    String decodeUTF(int utfSize) throws IOException {
4373819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        return decodeUTF(utfSize, this);
4383819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson    }
4393819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson
4403819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson    private static String decodeUTF(int utfSize, DataInput in) throws IOException {
441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] buf = new byte[utfSize];
442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        char[] out = new char[utfSize];
4433819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        in.readFully(buf, 0, utfSize);
4443819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson
4453819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        return Util.convertUTF8WithBuf(buf, out, 0, utfSize);
446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Reads a string encoded in {@link DataInput modified UTF-8} from the
450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {@code DataInput} stream {@code in}.
4513819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param in
453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the input stream to read from.
454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the next {@link DataInput MUTF-8} encoded string from the source
455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         stream.
456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IOException
457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if a problem occurs while reading from this stream.
458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see DataOutputStream#writeUTF(java.lang.String)
459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final String readUTF(DataInput in) throws IOException {
4613819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        return decodeUTF(in.readUnsignedShort(), in);
462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Skips {@code count} number of bytes in this stream. Subsequent {@code
466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * read()}s will not return these bytes unless {@code reset()} is used.
4673819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This method will not throw an {@link EOFException} if the end of the
469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * input is reached before {@code count} bytes where skipped.
4703819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param count
472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the number of bytes to skip.
473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the number of bytes actually skipped.
474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IOException
475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if a problem occurs during skipping.
476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see #mark(int)
477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see #reset()
478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final int skipBytes(int count) throws IOException {
480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int skipped = 0;
481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        long skip;
482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        while (skipped < count && (skip = in.skip(count - skipped)) != 0) {
483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            skipped += skip;
484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // BEGIN android-removed
486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // if (skipped < 0) {
487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        //     throw new EOFException();
488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // }
489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // END android-removed
490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return skipped;
491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
493