将ByteArrayOutputStream传递给DataOutputStream的构造函数

时间:2012-12-24 11:43:51

标签: java dataoutputstream bytearrayoutputstream

我知道这可以使用包装器模式完成,但我很难理解,以下代码如何工作。

ByteArrayOutputStream bytearray = new ByteArrayOutputStream();
DataOutputStream os = new DataOutputStream(bytearray);

ByteArrayOutputStream引用传递给DataOutputStream的构造函数意味着DataOutputStream转换为ByteArrayOutputStream,但是如何?

在此之后,os.writeUTF("String"); DataOutputStream如何转换为ByteArrayOutputStream

幕后发生了什么?有人可以解释一下细节。

2 个答案:

答案 0 :(得分:5)

DataOutputStream只需要在其构造函数中实现OutputStream。它并不关心它是如何实现的,只是它满足界面。 ByteArrayOutputStream提供由字节数组支持的输出流。同样,您可以使用FileOutputStream来获取磁盘上文件支持的流。从DataOutputStream的角度来看,它们都是与界面一起使用的流。 OutputStream是一个非常简单的接口,只是定义了一些将字节数组写入某种存储设备的方法。

幕后没有任何魔力,它只使用了OutputStream并且并不关心它是如何实现的。

答案 1 :(得分:0)

实际上这可以称为装饰模式。 DataOutputStream接受任何现有的OutputStream(在我们的例子中是ByteArrayOutputStream)并在

中存储对它的引用
protected OutputStream out;

(实际上是在DataOutputStream扩展的java.io.FilterOutputStream中)。

现在让我们看看DataOutputStream.writeInt是如何工作的(writeUTF太重了)

public final void writeInt(int v) throws IOException {
    out.write((v >>> 24) & 0xFF);
    out.write((v >>> 16) & 0xFF);
    out.write((v >>>  8) & 0xFF);
    out.write((v >>>  0) & 0xFF);
...

它只需要一个int arg并使用常规的OutputStream.write(byte)逐字节写入其4个字节。在我们的例子中,这些字节将写入ByteArrayOutputStream内部字节数组。如果可以将ByteArryOutputStream更改为FileOuputStream并将数据写入文件,则DataOutuputStream不需要知道实际的实现。