io笔记
当混用用了字符流和字节流,就涉及到关闭问题了
下面是一段 io 代码
// 字节流和字符流的相互转化
FileInputStream fileInputStream = null;
BufferedWriter writer = null;
BufferedReader reader = null;
try {
fileInputStream = new FileInputStream("1.txt");
// inputSreamReader本来就是reader对象,创建的时候需要传入一个InputStream对象,将字节流转化为字符流
reader = new BufferedReader(new InputStreamReader(fileInputStream));
// 将字符流转化为字节流
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream("2.txt"));
writer = new BufferedWriter(outputStreamWriter);
// 实现拷贝文件的操作
String buf;
while ((buf = reader.readLine()) != null) {
writer.write(buf);
writer.newLine();
System.out.println(buf);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (writer != null) {
writer.close();
}
} catch (IOException e) {
e.printStackTrace();
}
// 关闭流
try {
if (reader != null) {
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
这里有关闭的顺序的,否则会报错
这里可以看java.io.BufferedInputStream 的api close方法
/**
* Closes this input stream and releases any system resources
* associated with the stream.
* Once the stream has been closed, further read(), available(), reset(),
* or skip() invocations will throw an IOException.
* Closing a previously closed stream has no effect.
*
* @exception IOException if an I/O error occurs.
*/
关闭该流并释放与之关联的所有资源。在关闭该流后,再调用 read()、ready()、mark()、reset() 或 skip() 将抛出 IOException。关闭以前关闭的流无效。
这样理解:
java.io.BufferedInputStream是java.io.InputStream的装饰类。
BufferedInputStream装饰一个 InputStream 使之具有缓冲功能
要关闭只需要调用最终被装饰出的对象的 close()方法即可,因为它最终会调用真正数据源对象的 close()方法。
一般情况下是:先打开的后关闭,后打开的先关闭
另一种情况:看依赖关系,如果流a依赖流b,应该先关闭流a,再关闭流b
例如处理流a依赖节点流b,应该先关闭处理流a,再关闭节点流b
当然完全可以只关闭处理流,不用关闭节点流。处理流关闭的时候,会调用其处理的节点流的关闭方法
如果将节点流关闭以后再关闭处理流,会抛出IO异常;