A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李志广 中级黑马   /  2012-7-27 11:49  /  2197 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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();会出错呢,而且电脑还会嘟嘟的响??????

4 个回复

倒序浏览
本帖最后由 刘馨琪 于 2012-7-27 11:55 编辑

怎么个响法?长短声顺序是?
我的没问题,复制的你的代码。唯一区别就是放到d盘下了。
回复 使用道具 举报
一般情况下是:先打开的后关闭,后打开的先关闭

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

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

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

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


回复 使用道具 举报
本帖最后由 陈汉维 于 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("写入歌曲失败");
    }
   }
  }
当文件读取完后,输入流缓冲区和输出流缓冲区中都没有数据,输入流缓冲区和输出流缓冲区谁先关闭谁后关闭都可以,没有先后的顺序。
回复 使用道具 举报
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("写入歌曲失败");
                                }

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马