public ByteArrayOutputStream(int size) {( w& J+ K2 G7 v+ R5 M: |
if (size 〈 0) {8 R0 w: b' p1 v' J
throw new IllegalArgumentException("Negative initial size: " + size);
9 d) R1 D% O6 e i+ ~ }9 `) [ D) N$ h# o; O
buf = new byte[size];
0 @1 o, T2 A" a1 Y/ \3 H }
1 r5 q4 |# C- \ K1 G e public synchronized void write(int b) {
( d+ F( o* H7 Q! o0 z int newcount = count + 1;& N. {; l& `3 F% f
if (newcount 〉 buf.length) {
/ ]2 x" Q9 A+ h, K byte newbuf[] = new byte[Math.max(buf.length 〈〈 1, newcount)];9 _. s* x w- [6 Z
System.arraycopy(buf, 0, newbuf, 0, count);# t5 f( u' Q; T* Y4 d
buf = newbuf;
5 l& u! @+ z" r9 f }* `, |- D. \1 _2 D+ z! R
buf[count] = (byte)b;
+ S+ u& d) k# k: c count = newcount;
$ k- H+ O1 h" i) R8 F }$ c4 Y6 @: L2 Q( l2 q4 V
...
. x! v* u6 C$ C5 a1 N }* n( y. e( w8 m0 Y9 S9 ~* L7 K* F
它实现了OutputStream中的write(int b)方法,因此我们可以用来创建输出流的对象,并完成特定格式的输出。它相当于Decorator模式中的ConcreteComponent类。
* W; g+ X \& y4 w 接着来看一下FilterOutputStream,代码如下:, _& A1 H2 |, I0 Y/ A$ b- t1 w2 h
以下是代码片段:
: D# q2 g- Q& ]+ h public class FilterOutputStream extends OutputStream {$ I5 z1 r" z: |- Q) o& @3 J1 J
protected OutputStream out;2 w+ w: ^! l2 b/ y2 s4 e+ H! i$ H
public FilterOutputStream(OutputStream out) {0 G# o, w& p/ M* f0 ^
this.out = out;1 }. N8 y7 g$ K' a. [/ Q3 N
}5 t9 M/ H$ g0 W2 |
public void write(int b) throws IOException {
4 |1 q3 z: R+ k$ s out.write(b);% k" g$ c6 i3 s& {! c5 F) O( m: @
}
+ f4 b$ w0 g% S( | ...; a, H+ z) A ]# e5 ?. [6 _. ?! V
}
+ [) E# P7 ]* B8 z0 b 同样,它也是从OutputStream继承。但是,它的构造函数很特别,需要传递一个OutputStream的引用给它,并且它将保存对此对象的引用。而如果没有具体的OutputStream对象存在,我们将无法创建FilterOutputStream。由于out既可以是指向FilterOutputStream类型的引用,也可以是指向ByteArrayOutputStream等具体输出流类的引用,因此使用多层嵌套的方式,我们可以为ByteArrayOutputStream添加多种装饰。这个FilterOutputStream类相当于Decorator模式中的Decorator类,它的write(int b)方法只是简单的调用了传入的流的write(int b)方法,而没有做更多的处理,因此它本质上没有对流进行装饰,所以继承它的子类必须覆盖此方法,以达到装饰的目的。6 d) o& ^3 t7 w. W
BufferedOutputStream 和 DataOutputStream是FilterOutputStream的两个子类,它们相当于Decorator模式中的ConcreteDecorator,并对传入的输出流做了不同的装饰。以BufferedOutputStream类为例:: }5 Z* H* P' W' O
以下是代码片段:
6 e. G3 @$ `( i0 n6 H public class BufferedOutputStream extends FilterOutputStream {5 A0 d' [8 T: W+ p% k8 |: V0 O0 E
...
* u1 ]% S& z0 C, Q4 O. O8 ? private void flushBuffer() throws IOException {, C6 [# S$ `" n
if (count 〉 0) {3 v0 O+ I* f- U( b8 H
out.write(buf, 0, count);
. L/ Y/ c9 |& c! D2 L count = 0;/ I( B3 O( [$ z' H
}
& J2 K. r$ h! J( v0 d. r } @1 f7 [% x; L' o; p( T
public synchronized void write(int b) throws IOException {
. e5 w& R6 \! Q if (count 〉= buf.length) {1 V4 c8 J/ z4 g4 W( V; p4 X
flushBuffer();
1 `0 w% s3 J' G1 c) ~3 P }1 _! `0 x+ H" ?+ B9 O5 {; f- ?2 x
buf[count++] = (byte)b;- _7 Q; a( z% G8 p. `5 L. y
}. o/ M" d8 n1 M8 _0 ?0 f. H& L! O
...
7 K' @" w: c/ t7 k) u3 O4 M } |