blob: e9c39f4e782727aea2d1d40ad3eb1f67b1fdec27 [file] [log] [blame]
/*
* Copyright (c) 2014-2021 by Wen Yu
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* This Source Code may also be made available under the following Secondary
* Licenses when the conditions for such availability set forth in the Eclipse
* Public License, v. 2.0 are satisfied: GNU General Public License, version 2
* or any later version.
*
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
*/
package pixy.io;
import java.io.DataInput;
import java.io.DataInputStream;
import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
/**
* Endian-aware InputStream backed up by ReadStrategy
*
* @author Wen Yu, yuwen_66@yahoo.com
* @version 1.0 02/03/2014
*/
public class EndianAwareInputStream extends InputStream implements DataInput {
private InputStream src;
private ReadStrategy strategy = ReadStrategyMM.getInstance();
public EndianAwareInputStream(InputStream is) {
this.src = is;
}
public int read() throws IOException {
return src.read();
}
public boolean readBoolean() throws IOException {
int ch = this.read();
if (ch < 0)
throw new EOFException();
return (ch != 0);
}
public byte readByte() throws IOException {
int ch = this.read();
if (ch < 0)
throw new EOFException();
return (byte)ch;
}
public char readChar() throws IOException {
return (char)(readShort()&0xffff);
}
public double readDouble() throws IOException {
return Double.longBitsToDouble(readLong());
}
public float readFloat() throws IOException {
return Float.intBitsToFloat(readInt());
}
public void readFully(byte[] b) throws IOException {
readFully(b, 0, b.length);
}
public void readFully(byte[] b, int off, int len) throws IOException {
int n = 0;
do {
int count = src.read(b, off + n, len - n);
if (count < 0)
throw new EOFException();
n += count;
} while (n < len);
}
public int readInt() throws IOException {
byte[] buf = new byte[4];
readFully(buf);
return strategy.readInt(buf, 0);
}
@Deprecated
public String readLine() throws IOException {
throw new UnsupportedOperationException(
"readLine is not supported by RandomAccessInputStream."
);
}
public long readLong() throws IOException {
byte[] buf = new byte[8];
readFully(buf);
return strategy.readLong(buf, 0);
}
public float readS15Fixed16Number() throws IOException {
byte[] buf = new byte[4];
readFully(buf);
return strategy.readS15Fixed16Number(buf, 0);
}
public short readShort() throws IOException {
byte[] buf = new byte[2];
readFully(buf);
return strategy.readShort(buf, 0);
}
public float readU16Fixed16Number() throws IOException {
byte[] buf = new byte[4];
readFully(buf);
return strategy.readU16Fixed16Number(buf, 0);
}
public float readU8Fixed8Number() throws IOException {
byte[] buf = new byte[2];
readFully(buf);
return strategy.readU8Fixed8Number(buf, 0);
}
public int readUnsignedByte() throws IOException {
int ch = this.read();
if (ch < 0)
throw new EOFException();
return ch;
}
public long readUnsignedInt() throws IOException {
return readInt()&0xffffffffL;
}
public int readUnsignedShort() throws IOException {
return readShort()&0xffff;
}
/**
* Due to the current implementation, writeUTF and readUTF are the
* only methods which are machine or byte sequence independent as
* they are actually both Motorola byte sequence under the hood.
*
* Whereas the following static method is byte sequence dependent
* as it calls readUnsignedShort of RandomAccessInputStream.
*
* <code>DataInputStream.readUTF(this)</code>;
*/
public String readUTF() throws IOException {
return new DataInputStream(this).readUTF();
}
public void setReadStrategy(ReadStrategy strategy)
{
this.strategy = strategy;
}
public int skipBytes(int n) throws IOException {
int bytes = src.read(new byte[n], 0, n);
/* return the actual number of bytes skipped */
return bytes;
}
public void close() throws IOException {
src.close();
}
}