comparison src/goodjava/io/LimitedInputStream.java @ 1480:1f41e5921090

input buffering
author Franklin Schmidt <fschmidt@gmail.com>
date Fri, 24 Apr 2020 14:32:20 -0600
parents
children
comparison
equal deleted inserted replaced
1479:bd13aaeaf6d4 1480:1f41e5921090
1 package goodjava.io;
2 import java.io.InputStream;
3 import java.io.FilterInputStream;
4 import java.io.IOException;
5
6
7 public final class LimitedInputStream extends FilterInputStream {
8 private final long limit;
9 private long pos = 0;
10
11 public LimitedInputStream(InputStream in, long limit) {
12 super(in);
13 this.limit = limit;
14 }
15
16 public synchronized int read() throws IOException {
17 if( pos >= limit )
18 return -1;
19 int n = super.read();
20 if( n != -1 )
21 pos++;
22 return n;
23 }
24
25 public synchronized int read(byte[] b, int off, int len) throws IOException {
26 long avail = limit - pos;
27 if( avail <= 0 )
28 return -1;
29 if( len > avail )
30 len = (int)avail;
31 int n = super.read(b,off,len);
32 if( n > 0 )
33 pos += n;
34 return n;
35 }
36
37 public synchronized long skip(long n) throws IOException {
38 long avail = limit - pos;
39 if( avail <= 0 )
40 return 0;
41 if( n > avail )
42 n = (int)avail;
43 n = super.skip(n);
44 pos += n;
45 return n;
46 }
47
48 public synchronized int available() throws IOException {
49 long avail = limit - pos;
50 if( avail <= 0 )
51 return 0;
52 int n = super.available();
53 if( n > avail )
54 n = (int)avail;
55 return n;
56 }
57
58 }