我目前在我的代码中使用com.google.common.io.ByteArrayDataInput
。我正在写的是一种二进制文件的加载器。不幸的是,ByteArrayDataInput不提供其内部字节数组中剩余多少字节的信息。有没有提供此类信息的类的替代方法?我知道我可以为com.google.common.io.ByteArrayDataInput
编写自己的包装类,但我想避免使用它。
修改
问题是我对com.google.common.io.ByteArrayDataInput
实例的引用是通过一系列方法非常深入地传递的。它看起来像这样:
loadA(ByteArrayDataInput in)
调用loadB(in)
调用loadC(in);
等等。
每个loadX()方法都从in
读取内容。我想在ByteArrayDataInput.readFully()
中调用loadC()
方法,我想在该级别检查要读取多少字节。为了实现这个类,我需要通过所有loadX()
方法传递bytesLeft信息。
答案 0 :(得分:2)
ByteArrayInputStream的可用方法根据source返回数组中剩余的字节数。将其包含在ObjectInputStream中似乎可以为您提供相同的功能。 ObjectInputStream的available()方法从底层输入流返回available()而不进行任何处理。
答案 1 :(得分:0)
我必须为Guava ByteArrayDataInputWrapper
准备我自己的包装类。
它添加了一个新方法getAvailable()
,它返回剩余要读取的字节数。
public class ByteArrayDataInputWrapper implements ByteArrayDataInput {
private static final int INT_LENGTH = 4;
private static final int FLOAT_LENGTH = 4;
private static final int LONG_LENGTH = 8;
private static final int DOUBLE_LENGTH = 8;
private ByteArrayDataInput in;
private int available;
public ByteArrayDataInputWrapper(byte[] binary) {
if (binary != null) {
in = ByteStreams.newDataInput(binary);
available = binary.length;
}
}
public int getAvailable() {
return available;
}
@Override
public void readFully(byte[] b) {
in.readFully(b);
available -= b.length;
}
@Override
public void readFully(byte[] b, int off, int len) {
in.readFully(b, off, len);
available -= len;
}
@Override
public int skipBytes(int n) {
int skipped = in.skipBytes(n);
available -= skipped;
return skipped;
}
@Override
public boolean readBoolean() {
boolean result = in.readBoolean();
available--;
return result;
}
@Override
public byte readByte() {
byte result = in.readByte();
available--;
return result;
}
@Override
public int readUnsignedByte() {
int result = in.readUnsignedByte();
available--;
return result;
}
@Override
public short readShort() {
short result = in.readShort();
available -= 2;
return result;
}
@Override
public int readUnsignedShort() {
int result = in.readUnsignedShort();
available -= 2;
return result;
}
@Override
public char readChar() {
char result = in.readChar();
available -= 2;
return result;
}
@Override
public int readInt() {
int result = in.readInt();
available -= INT_LENGTH;
return result;
}
@Override
public long readLong() {
long result = in.readLong();
available -= LONG_LENGTH;
return result;
}
@Override
public float readFloat() {
float result = in.readFloat();
available -= FLOAT_LENGTH;
return result;
}
@Override
public double readDouble() {
double result = in.readDouble();
available -= DOUBLE_LENGTH;
return result;
}
@Override
public String readLine() {
String result = in.readLine();
if (result != null) {
available -= result.length();
}
return result;
}
@Override
public String readUTF() {
String result = in.readUTF();
if (result != null) {
available -= result.length();
}
return result;
}
}