黑马程序员技术交流社区

标题: IO流关闭先后的问题 [打印本页]

作者: 李志广    时间: 2012-7-27 11:49
标题: IO流关闭先后的问题
本帖最后由 007lzg 于 2012-7-27 14:10 编辑

import java.io.*;
class CopyMp3
{
        public static void main(String[] args)
        {
                copy();
        }
        public static void copy()
                {
                BufferedInputStream bufis=null;
                BufferedOutputStream bufos=null;
                try
                {
                        bufis=new BufferedInputStream(new FileInputStream("c:\\0.mp3"));
                        bufos=new BufferedOutputStream(new FileOutputStream("c:\\1.mp3"));
                        int ch=0;
                        while((ch=bufis.read())!=-1)
                                {
                                bufos.write(ch);
                                }
                }
                catch (IOException e)
                {
                        throw new RuntimeException("复制歌曲失败");
                }
                finally
                        {
                        if(bufis!=null)
                                try
                                {
                                        bufis.close();
                                }
                                catch (IOException e)
                                {
                                        throw new RuntimeException("读取歌曲失败");
                                }
                                if(bufos!=null)
                                try
                                {
                                        bufos.close();
                                }
                                catch (IOException e)
                                {
                                        throw new RuntimeException("写入歌曲失败");
                                }
                        }
                }
}

===========================================
finally
                        {
                        if(bufos!=null)
                                try
                                {
                                        bufos.close();
                                }
                                catch (IOException e)
                                {
                                        throw new RuntimeException("读取歌曲失败");
                                }
                                if(bufis!=null)
                                try
                                {
                                        bufis.close();
                                }
                                catch (IOException e)
                                {
                                        throw new RuntimeException("写入歌曲失败");
                                }


下面红色部分的代码是正确的,有一点我不明白,到最后关闭bufos.close();  bufis.close();有先后关系吗?
为什么先关闭bufis.close();会出错呢,而且电脑还会嘟嘟的响??????

作者: 党巾水    时间: 2012-7-27 11:52
本帖最后由 刘馨琪 于 2012-7-27 11:55 编辑

怎么个响法?长短声顺序是?
我的没问题,复制的你的代码。唯一区别就是放到d盘下了。
作者: 乐峰    时间: 2012-7-27 11:55
一般情况下是:先打开的后关闭,后打开的先关闭

另一种情况:看依赖关系,如果流a依赖流b,应该先关闭流a,再关闭流b

例如处理流a依赖节点流b,应该先关闭处理流a,再关闭节点流b

当然完全可以只关闭处理流,不用关闭节点流。处理流关闭的时候,会调用其处理的节点流的关闭方法

如果将节点流关闭以后再关闭处理流,会抛出IO异常



作者: 陈汉维    时间: 2012-7-27 12:25
本帖最后由 陈汉维 于 2012-7-27 12:42 编辑

经过测试,你的代码没问题,个人觉得还是这样写比较好:
public static void copy()
  {
   BufferedInputStream bufis=null;
   BufferedOutputStream bufos=null;
   try
   {
    bufis=new BufferedInputStream(new FileInputStream("c:\\0.mp3"));
    bufos=new BufferedOutputStream(new FileOutputStream("c:\\1.mp3"));
    int ch=0;
    while((ch=bufis.read())!=-1)
    {
     bufos.write(ch);
    }
   }
   catch (IOException e)
   {
     throw new RuntimeException("复制歌曲失败");
   }
   finally
   {
    try
    {
      if(bufis!=null)
       bufis.close();
    }
    catch (IOException e)
    {
      throw new RuntimeException("读取歌曲失败");
    }
    try
    {
      if(bufos!=null)
      bufos.close();
    }
    catch (IOException e)
    {
      throw new RuntimeException("写入歌曲失败");
    }
   }
  }
当文件读取完后,输入流缓冲区和输出流缓冲区中都没有数据,输入流缓冲区和输出流缓冲区谁先关闭谁后关闭都可以,没有先后的顺序。

作者: 李菁    时间: 2012-7-27 12:50
finally
                        {
                        if(bufos!=null)    判断为不为空不放在try里吗处理异常啊。
                                          应该把判断输入流缓冲区和输出流缓冲区是否为空都放到try里面。
                                          
                                          因为对缓冲区的数据都处理完了。所以这两个流先关闭谁都没有关系。

                                try
                                {
                                        bufos.close();
                                }
                                catch (IOException e)
                                {
                                        throw new RuntimeException("读取歌曲失败");
                                }
                                if(bufis!=null)
                                try
                                {
                                        bufis.close();
                                }
                                catch (IOException e)
                                {
                                        throw new RuntimeException("写入歌曲失败");
                                }






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2