调用的一个方法返回一个InputStream,然后再把此InputStream作为参数传给另一个方法,我想问那谁来负责关闭此InputStream了?

dddlgbb 2006-03-02 10:49:50

有个方法f1()返回Instream,另一个方法f2(Instream)以Instream作为对象,这两个方法都是别人实现。使用这两个方法如下
myfun(){
Instream in=f1();
f2(in);
}
那关闭Instream是应在f1中还是f2()中或在myfun中的调用f2()后,用in.close();关闭?
如果myfun实现改为
myfun(){
f2(f1());
}
又如何了?

...全文
1100 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
mudboy 2006-03-06
  • 打赏
  • 举报
回复
最好成对关闭,不要这么做
dddlgbb 2006-03-06
  • 打赏
  • 举报
回复
再举个具体的例子。
jdom中向文件写入xml
org.jdom.output.XMLOutputter xmlouter= new org.jdom.output.XMLOutputter();
xmlouter.output(doc,new FileOutputStream("a.xml")); ---1

其中1处就不能这么写,是吗?
yanhan0615 2006-03-02
  • 打赏
  • 举报
回复
我觉得应该告诉提供方法的人再封装一个方法用来在使用完毕之后关闭流
lovecat_sc 2006-03-02
  • 打赏
  • 举报
回复
应该是在调用f2()后用in.close();来关闭
crazycy 2006-03-02
  • 打赏
  • 举报
回复
可以设置成一个全局的,统一关闭
coolarmy 2006-03-02
  • 打赏
  • 举报
回复
无所谓吧!只要保证能关闭就可以了
dddlgbb 2006-03-02
  • 打赏
  • 举报
回复
如象f(new FileInstream(new File("xxx")));这样的调用方式,只能在f中关闭instream了?
maquan 2006-03-02
  • 打赏
  • 举报
回复
> 也就是说现在定义的接口还和调用此接口的方式有关,这样是不是太不灵活了?

所谓“定义接口”应该包括“规定此接口的调用方式”吧?

比如楼主的问题中,定义 f1() 的人应该说清楚,返回的那个 stream 是由 caller 负责关闭还是调用另一个跟 f1 一起提供的 method 来关闭;定义 f2() 的人应该说清楚,传进去的那个 stream 会不会在 f2 返回之前被关闭。
dddlgbb 2006-03-02
  • 打赏
  • 举报
回复
如定义一个方法f(Instream in),此方法是别人实现。
如规定在f中负责关闭in,那按下面方式调用
Instream in=new FileInstream(new File("xxx"));
f(in);
在调用方法f后,就不能再使用in了。
如规定在f中不负责关闭in,那就不能按下面方法调用了
f(new FileInstream(new File("xxx")));

也就是说现在定义的接口还和调用此接口的方式有关,这样是不是太不灵活了?
sandyen 2006-03-02
  • 打赏
  • 举报
回复
一般情况下这样的设计是不合理的,不能这么设计,象Stream,ResultSet这样的资源最好不要用来作为参数传来传去的,很容易忘记关闭,而且程序没有可读性。你应该把流中的数据读取出来再往下传。
搂主现在的情况下应该在myfun中(f2后面关闭)关闭流。

62,629

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧