java io/nio中“装饰器”模式应用,引发的流关闭问题(内存泄漏)

qulimin18 2010-04-21 10:35:10
1.在IO中采用“装饰器”模式来操纵流,到后面再关闭流/管道的时候,像这样:
FileChannel fc = new FileInputStream(filePath).getChannel();
fc.close();
你说最终会释放filePath所对应的系统资源吗?以避免出现内在泄漏。

还是我们最好这样做:
FileInputStream fis = new FileInputStream(filePath);
FileChannel fc = fis.getChannel();
fc.close(); //关闭管道
fis.close();//释放系统资料。

恭候大家来讨论。
...全文
307 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
fansfirst2008 2010-04-21
  • 打赏
  • 举报
回复
如果程序仅仅用到了FC这个对象,那么前面的就足够了!
如果还需要对FIS这个对象处理的话,那么显然需要后面的!
但是目前它们都是等效的,根据简化原则,我选前面的
qulimin18 2010-04-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 beiouwolf 的回复:]

汗。。。自己去看源代码
fis的
Java code

private FileChannel channel = null;
public FileChannel getChannel() {
synchronized (this) {
if (channel == null)
channel = FileChannelImpl.open(fd, ……
[/Quote]

这里是说在关闭fis流的时候会一同关闭连接此流的管道,多谢!这里我知道上面那种情况应该怎么关好了。就这样:
FileInputStream fis = new FileInputStream(filePath);
FileChannel fc = fis.getChannel();
fis.close(); //释放系统资源,关闭连接此流的管道。
因为有些nio的源码没找到,所以不敢肯定从关闭管道这边是怎样影响到它所连接到的流的。
sun.nio.ch.FileChannelImpl
beiouwolf 2010-04-21
  • 打赏
  • 举报
回复
第一,以你这个例子来说,怎么关都是一样的,因为操作的都是同一个channel,只是关一次和关两次的区别
不存在什么泄露问题
第二,如果是装饰器模式的话,实际上内部也是一样的,实际的文件句柄只有一个,不管你包裹几个实际上关一次就行了
qulimin18 2010-04-21
  • 打赏
  • 举报
回复
我认为引用系统资源的要将它明确声明出来,最后还要明确将它释放。
这样才能防止内存泄漏的发生。所以我认为第二种好一些(关闭管道的实现源码中并没有对fis流操作什么)。

多谢大家的回复。希望看到更多不同的见解。
beiouwolf 2010-04-21
  • 打赏
  • 举报
回复
汗。。。自己去看源代码
fis的

private FileChannel channel = null;
public FileChannel getChannel() {
synchronized (this) {
if (channel == null)
channel = FileChannelImpl.open(fd, true, false, this);
return channel;
}
}
public void close() throws IOException {
if (channel != null)
channel.close();
close0();
}


从外部获得的channel上关闭和一起关有区别吗。。。
zfq642773391 2010-04-21
  • 打赏
  • 举报
回复
从程序严谨上说,第二种更好,直接关闭流,第一种情况FileInputStream应该不会自动关闭,而是等垃圾收集器来处理它,容易出问题吧

62,614

社区成员

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

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