刘光辉
3 小时以前 06f314545ac3514d7ce28939920866ae8188d31c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package jnpf.fileStorage.dms;
 
import jnpf.exception.DataException;
 
import java.io.ByteArrayOutputStream;
import java.util.Arrays;
import java.util.Objects;
 
final class DmsBoundedByteArrayOutputStream extends ByteArrayOutputStream {
    private final long maximumBytes;
    private final String limitMessage;
 
    DmsBoundedByteArrayOutputStream(long maximumBytes, String limitMessage) {
        super(8192);
        if (maximumBytes < 0) {
            throw new IllegalArgumentException("maximumBytes must not be negative");
        }
        this.maximumBytes = maximumBytes;
        this.limitMessage = limitMessage;
    }
 
    @Override
    public synchronized void write(int value) {
        ensureCapacityFor(1);
        super.write(value);
    }
 
    @Override
    public synchronized void write(byte[] data, int offset, int length) {
        Objects.checkFromIndexSize(offset, length, data.length);
        ensureCapacityFor(length);
        super.write(data, offset, length);
    }
 
    private void ensureCapacityFor(int additionalBytes) {
        if ((long) count + additionalBytes > maximumBytes) {
            throw new DataException(limitMessage);
        }
    }
 
    synchronized byte[] toByteArrayAndRelease() {
        byte[] result = count == buf.length ? buf : Arrays.copyOf(buf, count);
        buf = new byte[0];
        count = 0;
        return result;
    }
}