黑马程序员技术交流社区
标题:
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("写入歌曲失败");
}
}
}
当文件读取完后,输入流缓冲区和输出流缓冲区中都没有数据,输入流缓冲区和输出流缓冲区谁先关闭谁后关闭都可以,没有先后的顺序。
1.jpg
(11.1 KB, 下载次数: 40)
下载附件
2012-7-27 12:42 上传
作者:
李菁
时间:
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