0

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

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

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

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

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

4

2 回答 2

5

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

幕后没有魔法,它只是使用 anOutputStream并不关心它是如何实现的。

于 2012-12-24T11:48:27.183 回答
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 不需要了解实际实现。

于 2012-12-24T13:08:16.597 回答