不知道大家对Java的流这个概念熟不熟悉,或者说对文件读写、网络数据读写熟不熟悉。
最近读《Java网络编程》第一章节的时候,正好看到了一段之前一直困惑我的代码。
InputStream
OutputStream
过滤器(filter)流可以串联到输入流或输出流上。可以来实现加密或者压缩,或者只是将数据转换为其他格式。DataOutputStream。简单说就是层层对流进行转化处理成指定的、最终所需要的、最方便使用的流。
DataOutputStream out = new DataOutputStream(
new BufferedOutputStream(
new FileOutputStream("data.txt"))
);
看到这段代码,先别急着看下去,不知道大家是不是跟我有一样的疑惑为什么是这样子层层嵌套?难道只是为了少一点临时变量,代码整洁吗?为什么不能写成下面这样呢?
FileOutputStream fout = new FileOutputStream("data.txt");
BufferedOutputStream bout = new BufferedOutputStream(fout);
DataOutputStream out = new DataOutputStream(bout);
原因:之后的使用中,很容易出现对fout、bout、out混淆;混着用read()方法,也就是会调用同一个数据源的不同流,这就可能会违反过滤器流的一些隐含约定。大多数情况下都是对最后一个过滤器进行实际读写,也就是这里的DataOutputStream ;试想一下如果使用bout的破坏了缓冲区数据怎么办呢?
而串联起来之后自然就避免了这个问题。