本帖最后由 qulimin18 于 2010-04-21 10:43:12 编辑

解决方案 »

  1.   

    如果程序仅仅用到了FC这个对象,那么前面的就足够了!
    如果还需要对FIS这个对象处理的话,那么显然需要后面的!
    但是目前它们都是等效的,根据简化原则,我选前面的
      

  2.   

    从程序严谨上说,第二种更好,直接关闭流,第一种情况FileInputStream应该不会自动关闭,而是等垃圾收集器来处理它,容易出问题吧
      

  3.   

    汗自己去看源代码
    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上关闭和一起关有区别吗
      

  4.   

    我认为引用系统资源的要将它明确声明出来,最后还要明确将它释放。
    这样才能防止内存泄漏的发生。所以我认为第二种好一些(关闭管道的实现源码中并没有对fis流操作什么)。多谢大家的回复。希望看到更多不同的见解。
      

  5.   

    第一,以你这个例子来说,怎么关都是一样的,因为操作的都是同一个channel,只是关一次和关两次的区别
    不存在什么泄露问题
    第二,如果是装饰器模式的话,实际上内部也是一样的,实际的文件句柄只有一个,不管你包裹几个实际上关一次就行了
      

  6.   


    这里是说在关闭fis流的时候会一同关闭连接此流的管道,多谢!这里我知道上面那种情况应该怎么关好了。就这样:
      FileInputStream fis = new FileInputStream(filePath);
      FileChannel fc = fis.getChannel();
      fis.close(); //释放系统资源,关闭连接此流的管道。
    因为有些nio的源码没找到,所以不敢肯定从关闭管道这边是怎样影响到它所连接到的流的。
    sun.nio.ch.FileChannelImpl