《Java网络编程》笔记
不知道大家对Java的流这个概念熟不熟悉,或者说对文件读写、网络数据读写熟不熟悉。
最近读《Java网络编程》第一章节的时候,正好看到了一段之前一直困惑我的代码。
前置知识
输入流
InputStream
- FileInputStream 从文件中读数据
- TelnetInputStream从网络中读数据
- ByteArrayStream 从字节数组中读数据
输出流
OutputStream
- FileOutputStream把数据写入文件
- TalnetOutputStream把数据写入网络
- ByteArrayOutputStream 把数据写入可扩展的字节数组
过滤器流
过滤器(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
的破坏了缓冲区数据怎么办呢?
而串联起来之后自然就避免了这个问题。