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 请老师们 看看 我这里哪里出现问题 ?谢谢。 想问一个Java用socket传送文件的问题 构造方法和继承 正则表达式求解· 一个关于逻辑符号的问题 求教路径问题 文件复制 applet的入门问题,请帮忙 100分 献身java的编码员都是受虐待狂 套壳是什么意思 请教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