这个LimitedInputStream是否正确?

时间:2011-05-28 15:18:29

标签: java error-handling inputstream error-recovery

我写了一个名为LimitedInputStream的课程。它包装现有的输入流,以将从中读取的字节数限制为指定的长度。它意味着替代:

byte[] data = readAll(length);
InputStream ins = new ByteArrayInputStream(data);

这需要额外的缓冲区。

这是班级:

public static class LimitedInputStream extends InputStream {
    private final InputStream ins;
    private int left;
    private int mark = -1;

    public LimitedInputStream(InputStream ins, int limit) {
        this.ins = ins;
        left = limit;
    }

    public void skipRest() throws IOException {
        ByteStreams.skipFully(ins, left);
        left = 0;
    }

    @Override
    public int read() throws IOException {
        if (left == 0) return -1;
        final int read = ins.read();
        if (read > 0) left--;
        return read;
    }

    @Override
    public int read(byte[] b, int off, int len) throws IOException {
        if (left == 0) return -1;
        if (len > left) len = left;
        final int read = ins.read(b, off, len);
        if (read > 0) left -= read;
        return read;
    }

    @Override
    public int available() throws IOException {
        final int a = ins.available();
        return a > left ? left : a;
    }

    @Override
    public void mark(int readlimit) {
        ins.mark(readlimit);
        mark = left;
    }

    @Override
    public void reset() throws IOException {
        if (!ins.markSupported()) throw new IOException("Mark not supported");
        if (mark == -1) throw new IOException("Mark not set");

        ins.reset();
        left = mark;
    }

    @Override
    public long skip(long n) throws IOException {
        if (n > left) n = left;
        long skipped = ins.skip(n);
        left -= skipped;
        return skipped;
    }

}

用例:

Object readObj() throws IOException {
    int len = readInt();
    final LimitedInputStream lis = new LimitedInputStream(this, len);
    try {
        return deserialize(new CompactInputStream(lis));
    } finally {
        lis.skipRest();
    }
}

for (something) {
  Object obj;
 try {
   obj = readObj();
 } catch (Exception e) {
   obj = null;
 }
 list.add(obj);
}

您是否可以通过代码审核我的班级是否存在任何严重错误,例如:更新left时可能出现的错误?

1 个答案:

答案 0 :(得分:1)

Guava包含LimitInputStream,因此您可能只想使用它。