11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/* 21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2007 The Guava Authors 31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License"); 51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * you may not use this file except in compliance with the License. 61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * You may obtain a copy of the License at 71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0 91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software 111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS, 121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * See the License for the specific language governing permissions and 141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * limitations under the License. 151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.io; 181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.Beta; 201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.base.Preconditions; 211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.primitives.Ints; 221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.primitives.Longs; 231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.io.DataInput; 251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.io.DataInputStream; 261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.io.EOFException; 271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.io.FilterInputStream; 281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.io.IOException; 291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.io.InputStream; 301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/** 321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * An implementation of {@link DataInput} that uses little-endian byte ordering 331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * for reading {@code short}, {@code int}, {@code float}, {@code double}, and 341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@code long} values. 351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p> 361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <b>Note:</b> This class intentionally violates the specification of its 371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * supertype {@code DataInput}, which explicitly requires big-endian byte order. 381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Chris Nokleberg 401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Keith Bottner 411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 8.0 421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@Beta 441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic final class LittleEndianDataInputStream extends FilterInputStream 451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert implements DataInput { 461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Creates a {@code LittleEndianDataInputStream} that wraps the given stream. 491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param in the stream to delegate to 511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public LittleEndianDataInputStream(InputStream in) { 531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert super(Preconditions.checkNotNull(in)); 541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * This method will throw an {@link UnsupportedOperationException}. 581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public String readLine() { 611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throw new UnsupportedOperationException("readLine is not supported"); 621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void readFully(byte[] b) throws IOException { 661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ByteStreams.readFully(this, b); 671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void readFully(byte[] b, int off, int len) throws IOException { 711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ByteStreams.readFully(this, b, off, len); 721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public int skipBytes(int n) throws IOException { 761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return (int) in.skip(n); 771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public int readUnsignedByte() throws IOException { 811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int b1 = in.read(); 821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (0 > b1) { 831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throw new EOFException(); 841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return b1; 871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Reads an unsigned {@code short} as specified by 911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link DataInputStream#readUnsignedShort()}, except using little-endian 921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * byte order. 931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return the next two bytes of the input stream, interpreted as an 951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * unsigned 16-bit integer in little-endian byte order 961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @throws IOException if an I/O error occurs 971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public int readUnsignedShort() throws IOException { 1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert byte b1 = readAndCheckByte(); 1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert byte b2 = readAndCheckByte(); 1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Ints.fromBytes((byte) 0, (byte) 0, b2, b1); 1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Reads an integer as specified by {@link DataInputStream#readInt()}, except 1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * using little-endian byte order. 1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return the next four bytes of the input stream, interpreted as an 1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@code int} in little-endian byte order 1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @throws IOException if an I/O error occurs 1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public int readInt() throws IOException { 1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert byte b1 = readAndCheckByte(); 1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert byte b2 = readAndCheckByte(); 1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert byte b3 = readAndCheckByte(); 1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert byte b4 = readAndCheckByte(); 1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Ints.fromBytes( b4, b3, b2, b1); 1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Reads a {@code long} as specified by {@link DataInputStream#readLong()}, 1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * except using little-endian byte order. 1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return the next eight bytes of the input stream, interpreted as a 1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@code long} in little-endian byte order 1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @throws IOException if an I/O error occurs 1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public long readLong() throws IOException { 1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert byte b1 = readAndCheckByte(); 1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert byte b2 = readAndCheckByte(); 1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert byte b3 = readAndCheckByte(); 1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert byte b4 = readAndCheckByte(); 1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert byte b5 = readAndCheckByte(); 1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert byte b6 = readAndCheckByte(); 1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert byte b7 = readAndCheckByte(); 1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert byte b8 = readAndCheckByte(); 1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Longs.fromBytes(b8, b7, b6, b5, b4, b3, b2, b1); 1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Reads a {@code float} as specified by {@link DataInputStream#readFloat()}, 1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * except using little-endian byte order. 1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return the next four bytes of the input stream, interpreted as a 1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@code float} in little-endian byte order 1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @throws IOException if an I/O error occurs 1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public float readFloat() throws IOException { 1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Float.intBitsToFloat(readInt()); 1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Reads a {@code double} as specified by 1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link DataInputStream#readDouble()}, except using little-endian byte 1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * order. 1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return the next eight bytes of the input stream, interpreted as a 1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@code double} in little-endian byte order 1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @throws IOException if an I/O error occurs 1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public double readDouble() throws IOException { 1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Double.longBitsToDouble(readLong()); 1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public String readUTF() throws IOException { 1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new DataInputStream(in).readUTF(); 1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Reads a {@code short} as specified by {@link DataInputStream#readShort()}, 1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * except using little-endian byte order. 1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return the next two bytes of the input stream, interpreted as a 1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@code short} in little-endian byte order. 1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @throws IOException if an I/O error occurs. 1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public short readShort() throws IOException { 1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return (short) readUnsignedShort(); 1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Reads a char as specified by {@link DataInputStream#readChar()}, except 1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * using little-endian byte order. 1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return the next two bytes of the input stream, interpreted as a 1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@code char} in little-endian byte order 1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @throws IOException if an I/O error occurs 1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public char readChar() throws IOException { 2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return (char) readUnsignedShort(); 2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public byte readByte() throws IOException { 2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return (byte) readUnsignedByte(); 2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public boolean readBoolean() throws IOException { 2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return readUnsignedByte() != 0; 2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Reads a byte from the input stream checking that the end of file (EOF) 2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * has not been encountered. 2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return byte read from input 2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @throws IOException if an error is encountered while reading 2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @throws EOFException if the end of file (EOF) is encountered. 2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private byte readAndCheckByte() throws IOException, EOFException { 2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int b1 = in.read(); 2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (-1 == b1) { 2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throw new EOFException(); 2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return (byte) b1; 2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert} 233