com.google.common.io.ByteArrayDataInput的替代方案?

时间:2012-02-21 14:00:49

标签: java guava

我目前在我的代码中使用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信息。

2 个答案:

答案 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;
    }

}