我知道这可以使用包装器模式完成,但我很难理解,以下代码如何工作。
ByteArrayOutputStream bytearray = new ByteArrayOutputStream();
DataOutputStream os = new DataOutputStream(bytearray);
将ByteArrayOutputStream
引用传递给DataOutputStream
的构造函数意味着DataOutputStream
转换为ByteArrayOutputStream
,但是如何?
在此之后,os.writeUTF("String");
DataOutputStream
如何转换为ByteArrayOutputStream
。
幕后发生了什么?有人可以解释一下细节。
答案 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不需要知道实际的实现。