java文件IO,关闭顺序

来源:互联网 发布:剑网3捏脸数据 编辑:程序博客网 时间:2024/06/02 00:28

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异常;



1 0
原创粉丝点击