cn.nukkit.nbt.stream.NBTInputStream Maven / Gradle / Ivy
package cn.nukkit.nbt.stream;
import cn.nukkit.utils.VarInt;
import java.io.DataInput;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteOrder;
import java.nio.charset.StandardCharsets;
/**
* @author MagicDroidX (Nukkit Project)
*/
public class NBTInputStream implements DataInput, AutoCloseable {
private final DataInputStream stream;
private final ByteOrder endianness;
private final boolean network;
public NBTInputStream(InputStream stream) {
this(stream, ByteOrder.BIG_ENDIAN);
}
public NBTInputStream(InputStream stream, ByteOrder endianness) {
this(stream, endianness, false);
}
public NBTInputStream(InputStream stream, ByteOrder endianness, boolean network) {
this.stream = stream instanceof DataInputStream ? (DataInputStream) stream : new DataInputStream(stream);
this.endianness = endianness;
this.network = network;
}
public ByteOrder getEndianness() {
return endianness;
}
public boolean isNetwork() {
return network;
}
@Override
public void readFully(byte[] b) throws IOException {
this.stream.readFully(b);
}
@Override
public void readFully(byte[] b, int off, int len) throws IOException {
this.stream.readFully(b, off, len);
}
@Override
public int skipBytes(int n) throws IOException {
return this.stream.skipBytes(n);
}
@Override
public boolean readBoolean() throws IOException {
return this.stream.readBoolean();
}
@Override
public byte readByte() throws IOException {
return this.stream.readByte();
}
@Override
public int readUnsignedByte() throws IOException {
return this.stream.readUnsignedByte();
}
@Override
public short readShort() throws IOException {
short s = this.stream.readShort();
if (endianness == ByteOrder.LITTLE_ENDIAN) {
s = Short.reverseBytes(s);
}
return s;
}
@Override
public int readUnsignedShort() throws IOException {
int s = this.stream.readUnsignedShort();
if (endianness == ByteOrder.LITTLE_ENDIAN) {
s = Integer.reverseBytes(s) >> 16;
}
return s;
}
@Override
public char readChar() throws IOException {
char c = this.stream.readChar();
if (endianness == ByteOrder.LITTLE_ENDIAN) {
c = Character.reverseBytes(c);
}
return c;
}
@Override
public int readInt() throws IOException {
if (network) {
return VarInt.readVarInt(this.stream);
}
int i = this.stream.readInt();
if (endianness == ByteOrder.LITTLE_ENDIAN) {
i = Integer.reverseBytes(i);
}
return i;
}
@Override
public long readLong() throws IOException {
if (network) {
return VarInt.readVarLong(this.stream);
}
long l = this.stream.readLong();
if (endianness == ByteOrder.LITTLE_ENDIAN) {
l = Long.reverseBytes(l);
}
return l;
}
@Override
public float readFloat() throws IOException {
int i = this.stream.readInt();
if (endianness == ByteOrder.LITTLE_ENDIAN) {
i = Integer.reverseBytes(i);
}
return Float.intBitsToFloat(i);
}
@Override
public double readDouble() throws IOException {
long l = this.stream.readLong();
if (endianness == ByteOrder.LITTLE_ENDIAN) {
l = Long.reverseBytes(l);
}
return Double.longBitsToDouble(l);
}
@Override
@Deprecated
public String readLine() throws IOException {
return this.stream.readLine();
}
@Override
public String readUTF() throws IOException {
int length = network ? (int) VarInt.readUnsignedVarInt(stream) : this.readUnsignedShort();
byte[] bytes = new byte[length];
this.stream.readFully(bytes);
return new String(bytes, StandardCharsets.UTF_8);
}
public int available() throws IOException {
return this.stream.available();
}
@Override
public void close() throws IOException {
this.stream.close();
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy