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