InputStream is = null;

is.close();
效果是否一样?

解决方案 »

  1.   

    不一样。is.close();是手动的关闭输入流,它将当前缓存中内容输出完毕,并且关闭相关占用的资源,而InputStream is = null;
    只是把输入流对象的引用释放掉了。有些数据还在缓存里,并没有真正写进文件,最好自己手动关,把缓存的数据都写进文件,而且如果你不关的话,可能别的程序就不能访问这个文件了,关了也节省资源,良好的习惯
      

  2.   

    InputStream is = null;只是引用置null成为可被垃圾回收的对象,但占用的资源还在,而close则是释放所占用的资源。所以有些资源必须由程序员明确调用某方法来释放,否则可能一直会占用内存。就像Linux系统子进程,退出以后如果不被回收,会成为僵尸进程。
      

  3.   

    查看了流的close源码,最终会调用到操作系统提供的接口close(int fd)函数,每个打开的流都和一个文件描述符fd对应,这个函数的作用是:closes  a file descriptor, so that it no longer refers to any file and may be reused.很显然这种功能是将一个引用置null做不到的。
      

  4.   

    public InputStream getUrlInputStream() throws Exception {
    URL url = null;
    InputStream is = null;
    try {
    inputPath = URLDecoder.decode(inputPath, "UTF-8");
    url = new URL(inputPath);
    is = url.openStream();
    } catch (Exception ex) {
    ex.printStackTrace();

    /**finally {
    try {
    //if (is != null)
    //is.close();
    } catch (Exception e) {
    e.printStackTrace();
    }
    }*/
    return is;
    }
    如果是这个代码,关闭了就无法返回资源了?这个要怎么处理呢?
      

  5.   

    不close或flush资源是无法写入到文件中去的,而将对象的引用置为null只是改变了对象的引用,等待GC回收,资源并没有写入到文件!
      

  6.   

    由方法的调用者负责关闭流。就像URL类的openStream方法