java io/nio中“装饰器”模式应用,引发的流关闭问题(内存泄漏) 本帖最后由 qulimin18 于 2010-04-21 10:43:12 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果程序仅仅用到了FC这个对象,那么前面的就足够了!如果还需要对FIS这个对象处理的话,那么显然需要后面的!但是目前它们都是等效的,根据简化原则,我选前面的 从程序严谨上说,第二种更好,直接关闭流,第一种情况FileInputStream应该不会自动关闭,而是等垃圾收集器来处理它,容易出问题吧 汗自己去看源代码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上关闭和一起关有区别吗 我认为引用系统资源的要将它明确声明出来,最后还要明确将它释放。这样才能防止内存泄漏的发生。所以我认为第二种好一些(关闭管道的实现源码中并没有对fis流操作什么)。多谢大家的回复。希望看到更多不同的见解。 第一,以你这个例子来说,怎么关都是一样的,因为操作的都是同一个channel,只是关一次和关两次的区别不存在什么泄露问题第二,如果是装饰器模式的话,实际上内部也是一样的,实际的文件句柄只有一个,不管你包裹几个实际上关一次就行了 这里是说在关闭fis流的时候会一同关闭连接此流的管道,多谢!这里我知道上面那种情况应该怎么关好了。就这样: FileInputStream fis = new FileInputStream(filePath); FileChannel fc = fis.getChannel(); fis.close(); //释放系统资源,关闭连接此流的管道。因为有些nio的源码没找到,所以不敢肯定从关闭管道这边是怎样影响到它所连接到的流的。sun.nio.ch.FileChannelImpl 一道简单的面试题,小弟迷惑中,求解 新手求指导!!麻烦哪位高手写写归并算法的代码!!纠结了几天! swing中公告栏的信息怎么滚动??? 编程语句顺序的问题 如何控制窗口的最小宽度和高度,谁答出谁拿分阿! 我计算两个日期之间相差多少天 为什么得到的天数总是多334天呢?? 请问这段错误提示是什么意思? 通过Socket实现服务器推送文件问题 请教,在线等,解决后马上给分! 4个关于JTable的小问题,100相求,谢谢好心的好手!!! 请教myeclipse运行没问题,jar包导出不能运行的问题 【提问】java关键字volatile、双重检查 单例模式的应用
如果还需要对FIS这个对象处理的话,那么显然需要后面的!
但是目前它们都是等效的,根据简化原则,我选前面的
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上关闭和一起关有区别吗
这样才能防止内存泄漏的发生。所以我认为第二种好一些(关闭管道的实现源码中并没有对fis流操作什么)。多谢大家的回复。希望看到更多不同的见解。
不存在什么泄露问题
第二,如果是装饰器模式的话,实际上内部也是一样的,实际的文件句柄只有一个,不管你包裹几个实际上关一次就行了
这里是说在关闭fis流的时候会一同关闭连接此流的管道,多谢!这里我知道上面那种情况应该怎么关好了。就这样:
FileInputStream fis = new FileInputStream(filePath);
FileChannel fc = fis.getChannel();
fis.close(); //释放系统资源,关闭连接此流的管道。
因为有些nio的源码没找到,所以不敢肯定从关闭管道这边是怎样影响到它所连接到的流的。
sun.nio.ch.FileChannelImpl