DataInputStream.java revision 0
2362N/A * Copyright 1994-2006 Sun Microsystems, Inc. All Rights Reserved. 0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 0N/A * This code is free software; you can redistribute it and/or modify it 0N/A * under the terms of the GNU General Public License version 2 only, as 2362N/A * published by the Free Software Foundation. Sun designates this 0N/A * particular file as subject to the "Classpath" exception as provided 2362N/A * by Sun in the LICENSE file that accompanied this code. 0N/A * This code is distributed in the hope that it will be useful, but WITHOUT 0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 0N/A * version 2 for more details (a copy is included in the LICENSE file that 0N/A * accompanied this code). 0N/A * You should have received a copy of the GNU General Public License version 0N/A * 2 along with this work; if not, write to the Free Software Foundation, 0N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2362N/A * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, 2362N/A * CA 95054 USA or visit www.sun.com if you need additional information or 0N/A * A data input stream lets an application read primitive Java data 0N/A * types from an underlying input stream in a machine-independent 0N/A * way. An application uses a data output stream to write data that 0N/A * can later be read by a data input stream. 0N/A * DataInputStream is not necessarily safe for multithreaded access. 0N/A * Thread safety is optional and is the responsibility of users of 0N/A * methods in this class. 0N/A * @author Arthur van Hoff 0N/A * @see java.io.DataOutputStream 0N/A * Creates a DataInputStream that uses the specified 0N/A * underlying InputStream. 0N/A * @param in the specified input stream * working arrays initialized on demand by readUTF private byte bytearr[] =
new byte[
80];
private char chararr[] =
new char[
80];
* Reads some number of bytes from the contained input stream and * stores them into the buffer array <code>b</code>. The number of * bytes actually read is returned as an integer. This method blocks * until input data is available, end of file is detected, or an * <p>If <code>b</code> is null, a <code>NullPointerException</code> is * thrown. If the length of <code>b</code> is zero, then no bytes are * read and <code>0</code> is returned; otherwise, there is an attempt * to read at least one byte. If no byte is available because the * stream is at end of file, the value <code>-1</code> is returned; * otherwise, at least one byte is read and stored into <code>b</code>. * <p>The first byte read is stored into element <code>b[0]</code>, the * next one into <code>b[1]</code>, and so on. The number of bytes read * is, at most, equal to the length of <code>b</code>. Let <code>k</code> * be the number of bytes actually read; these bytes will be stored in * elements <code>b[0]</code> through <code>b[k-1]</code>, leaving * elements <code>b[k]</code> through <code>b[b.length-1]</code> * <p>The <code>read(b)</code> method has the same effect as: * @param b the buffer into which the data is read. * @return the total number of bytes read into the buffer, or * <code>-1</code> if there is no more data because the end * of the stream has been reached. * @exception IOException if the first byte cannot be read for any reason * other than end of file, the stream has been closed and the underlying * input stream does not support reading after close, or another I/O * @see java.io.FilterInputStream#in * @see java.io.InputStream#read(byte[], int, int) * Reads up to <code>len</code> bytes of data from the contained * input stream into an array of bytes. An attempt is made to read * as many as <code>len</code> bytes, but a smaller number may be read, * possibly zero. The number of bytes actually read is returned as an * <p> This method blocks until input data is available, end of file is * detected, or an exception is thrown. * <p> If <code>len</code> is zero, then no bytes are read and * <code>0</code> is returned; otherwise, there is an attempt to read at * least one byte. If no byte is available because the stream is at end of * file, the value <code>-1</code> is returned; otherwise, at least one * byte is read and stored into <code>b</code>. * <p> The first byte read is stored into element <code>b[off]</code>, the * next one into <code>b[off+1]</code>, and so on. The number of bytes read * is, at most, equal to <code>len</code>. Let <i>k</i> be the number of * bytes actually read; these bytes will be stored in elements * <code>b[off]</code> through <code>b[off+</code><i>k</i><code>-1]</code>, * leaving elements <code>b[off+</code><i>k</i><code>]</code> through * <code>b[off+len-1]</code> unaffected. * <p> In every case, elements <code>b[0]</code> through * <code>b[off]</code> and elements <code>b[off+len]</code> through * <code>b[b.length-1]</code> are unaffected. * @param b the buffer into which the data is read. * @param off the start offset in the destination array <code>b</code> * @param len the maximum number of bytes read. * @return the total number of bytes read into the buffer, or * <code>-1</code> if there is no more data because the end * of the stream has been reached. * @exception NullPointerException If <code>b</code> is <code>null</code>. * @exception IndexOutOfBoundsException If <code>off</code> is negative, * <code>len</code> is negative, or <code>len</code> is greater than * <code>b.length - off</code> * @exception IOException if the first byte cannot be read for any reason * other than end of file, the stream has been closed and the underlying * input stream does not support reading after close, or another I/O * @see java.io.FilterInputStream#in * @see java.io.InputStream#read(byte[], int, int) * See the general contract of the <code>readFully</code> * method of <code>DataInput</code>. * for this operation are read from the contained * @param b the buffer into which the data is read. * @exception EOFException if this input stream reaches the end before * @exception IOException the stream has been closed and the contained * input stream does not support reading after close, or * another I/O error occurs. * @see java.io.FilterInputStream#in * See the general contract of the <code>readFully</code> * method of <code>DataInput</code>. * for this operation are read from the contained * @param b the buffer into which the data is read. * @param off the start offset of the data. * @param len the number of bytes to read. * @exception EOFException if this input stream reaches the end before * @exception IOException the stream has been closed and the contained * input stream does not support reading after close, or * another I/O error occurs. * @see java.io.FilterInputStream#in * See the general contract of the <code>skipBytes</code> * method of <code>DataInput</code>. * Bytes for this operation are read from the contained * @param n the number of bytes to be skipped. * @return the actual number of bytes skipped. * @exception IOException if the contained input stream does not support * seek, or the stream has been closed and * the contained input stream does not support * reading after close, or another I/O error occurs. * See the general contract of the <code>readBoolean</code> * method of <code>DataInput</code>. * Bytes for this operation are read from the contained * @return the <code>boolean</code> value read. * @exception EOFException if this input stream has reached the end. * @exception IOException the stream has been closed and the contained * input stream does not support reading after close, or * another I/O error occurs. * @see java.io.FilterInputStream#in * See the general contract of the <code>readByte</code> * method of <code>DataInput</code>. * for this operation are read from the contained * @return the next byte of this input stream as a signed 8-bit * @exception EOFException if this input stream has reached the end. * @exception IOException the stream has been closed and the contained * input stream does not support reading after close, or * another I/O error occurs. * @see java.io.FilterInputStream#in * See the general contract of the <code>readUnsignedByte</code> * method of <code>DataInput</code>. * for this operation are read from the contained * @return the next byte of this input stream, interpreted as an * @exception EOFException if this input stream has reached the end. * @exception IOException the stream has been closed and the contained * input stream does not support reading after close, or * another I/O error occurs. * @see java.io.FilterInputStream#in * See the general contract of the <code>readShort</code> * method of <code>DataInput</code>. * for this operation are read from the contained * @return the next two bytes of this input stream, interpreted as a * @exception EOFException if this input stream reaches the end before * @exception IOException the stream has been closed and the contained * input stream does not support reading after close, or * another I/O error occurs. * @see java.io.FilterInputStream#in return (
short)((
ch1 <<
8) + (
ch2 <<
0));
* See the general contract of the <code>readUnsignedShort</code> * method of <code>DataInput</code>. * for this operation are read from the contained * @return the next two bytes of this input stream, interpreted as an * unsigned 16-bit integer. * @exception EOFException if this input stream reaches the end before * @exception IOException the stream has been closed and the contained * input stream does not support reading after close, or * another I/O error occurs. * @see java.io.FilterInputStream#in return (
ch1 <<
8) + (
ch2 <<
0);
* See the general contract of the <code>readChar</code> * method of <code>DataInput</code>. * for this operation are read from the contained * @return the next two bytes of this input stream, interpreted as a * @exception EOFException if this input stream reaches the end before * @exception IOException the stream has been closed and the contained * input stream does not support reading after close, or * another I/O error occurs. * @see java.io.FilterInputStream#in return (
char)((
ch1 <<
8) + (
ch2 <<
0));
* See the general contract of the <code>readInt</code> * method of <code>DataInput</code>. * for this operation are read from the contained * @return the next four bytes of this input stream, interpreted as an * @exception EOFException if this input stream reaches the end before * @exception IOException the stream has been closed and the contained * input stream does not support reading after close, or * another I/O error occurs. * @see java.io.FilterInputStream#in return ((
ch1 <<
24) + (
ch2 <<
16) + (
ch3 <<
8) + (
ch4 <<
0));
* See the general contract of the <code>readLong</code> * method of <code>DataInput</code>. * for this operation are read from the contained * @return the next eight bytes of this input stream, interpreted as a * @exception EOFException if this input stream reaches the end before * @exception IOException the stream has been closed and the contained * input stream does not support reading after close, or * another I/O error occurs. * @see java.io.FilterInputStream#in * See the general contract of the <code>readFloat</code> * method of <code>DataInput</code>. * for this operation are read from the contained * @return the next four bytes of this input stream, interpreted as a * @exception EOFException if this input stream reaches the end before * @exception IOException the stream has been closed and the contained * input stream does not support reading after close, or * another I/O error occurs. * @see java.io.DataInputStream#readInt() * @see java.lang.Float#intBitsToFloat(int) * See the general contract of the <code>readDouble</code> * method of <code>DataInput</code>. * for this operation are read from the contained * @return the next eight bytes of this input stream, interpreted as a * @exception EOFException if this input stream reaches the end before * @exception IOException the stream has been closed and the contained * input stream does not support reading after close, or * another I/O error occurs. * @see java.io.DataInputStream#readLong() * @see java.lang.Double#longBitsToDouble(long) * See the general contract of the <code>readLine</code> * method of <code>DataInput</code>. * for this operation are read from the contained * @deprecated This method does not properly convert bytes to characters. * As of JDK 1.1, the preferred way to read lines of text is via the * <code>BufferedReader.readLine()</code> method. Programs that use the * <code>DataInputStream</code> class to read lines can be converted to use * the <code>BufferedReader</code> class by replacing code of the form: * DataInputStream d = new DataInputStream(in); * = new BufferedReader(new InputStreamReader(in)); * @return the next line of text from this input stream. * @exception IOException if an I/O error occurs. * @see java.io.BufferedReader#readLine() * @see java.io.FilterInputStream#in if ((
c2 !=
'\n') && (
c2 != -
1)) {
if ((c == -
1) && (
offset ==
0)) {
* See the general contract of the <code>readUTF</code> * method of <code>DataInput</code>. * for this operation are read from the contained * @return a Unicode string. * @exception EOFException if this input stream reaches the end before * @exception IOException the stream has been closed and the contained * input stream does not support reading after close, or * another I/O error occurs. * @exception UTFDataFormatException if the bytes do not represent a valid * modified UTF-8 encoding of a string. * @see java.io.DataInputStream#readUTF(java.io.DataInput) * stream <code>in</code> a representation * of a Unicode character string encoded in * this string of characters is then returned as a <code>String</code>. * The details of the modified UTF-8 representation * are exactly the same as for the <code>readUTF</code> * method of <code>DataInput</code>. * @param in a data input stream. * @return a Unicode string. * @exception EOFException if the input stream reaches the end * @exception IOException the stream has been closed and the contained * input stream does not support reading after close, or * another I/O error occurs. * @exception UTFDataFormatException if the bytes do not represent a * valid modified UTF-8 encoding of a Unicode string. * @see java.io.DataInputStream#readUnsignedShort() case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
"malformed input: partial character at end");
if ((
char2 &
0xC0) !=
0x80)
"malformed input around byte " +
count);
/* 1110 xxxx 10xx xxxx 10xx xxxx */ "malformed input: partial character at end");
if (((
char2 &
0xC0) !=
0x80) || ((
char3 &
0xC0) !=
0x80))
"malformed input around byte " + (
count-
1));
/* 10xx xxxx, 1111 xxxx */ "malformed input around byte " +
count);
// The number of chars produced may be less than utflen