2011-05-28 149 views
0

我写过一个叫LimitedInputStream的课。它包装现有的输入流以将从中读取的字节数限制为指定的长度。这意味着作为替代:这个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时可能出现的错误?

+2

1. http://codereview.stackexchange.com 2.单元测试是你的朋友! – 2011-05-28 15:32:53

回答

1

番石榴包括一个LimitInputStream,所以你可能只想使用它。

+0

它没有像我的'skipRest'这样的方法,这是必需的,但是看它的源代码确实指向我自己的一些错误。 – 2011-05-28 16:06:19