1、流关闭的顺序
(1)流之间没有依赖关系:先打开的后关闭,后打开的先关闭;
(2)流之间存在依赖关系:如果流a依赖流b,那么应该先关闭流a,再关闭流b。例如:处理流a依赖节点流b,应该先关闭处理流a,再关闭节点流b。
(3)可以只关闭处理流,不用关闭节点流,因为处理流关闭的时候,会调用节点流的关闭方法。
注意:
1、如果先关闭节点流,再关闭处理流,会抛出IO异常;
2、如果关闭了处理流,再关闭节点流,需要先做判断;
FileOutputStream fos = new FileOutputStream(zipFileName);
ZipOutputStream zipOutput = new ZipOutputStream(fos);
//先关闭处理流
zipOutput.close();
//对节点流进行判断,不为空,再关闭
if (fos != null) {
try {
fos.close();
} catch (Exception e) {
logger.error("error", e);
}
}
2、流的概念
(1)节点流:可以从或向一个指定的地方读写数据,如FileReader;
(2)处理流:是对一个节点流的封装,通过封装的方法调用节点流功能进行读取数据。如BufferedReader.处理流的构造方法总是要带一个其他的流对象做参数。
3、常用的节点流
(1)FileInputStream FileOutputStream FileReader FileWriter 文件处理的流;
(2)StringReader StringWriter 对字符串进行处理的流;
(3)ByteArrayInputStream ByteArrayOutputStream CharArrayReader CharArrayWriter 对数组处理的流;
(4)PipedInputStream PipedOutputStream PipedReader PipedWriter 对管道进行处理的流
4、常用的处理流
(1)缓冲流 BufferedInputStream BufferdOutputStream BufferReader BufferedWriter ----增加缓冲功能,避免频繁读写硬盘;
(2)转换流 InputStreamReader OutputStreamReader -----实现字节流和字符流之间的转换;
(3)DataInputStream DataOutputStream ------ 将基础数据类型写入到文件中,或者从文件中读出来