会议室中讨论java I/O流的关闭问题

		......
              
              InputStream is = null;            
              BufferedInputStream bis = null;

		BufferedOutputStream bos = null;

		try {

			is = new FileInputStream(lfm.loadFile(req));

			bis = new BufferedInputStream(is);

			bos = new BufferedOutputStream(resp.getOutputStream());

			byte[] buf = new byte[1024];

			int len = bis.read(buf);

			while (len != -1) {

				bos.write(buf, 0, len);

				len = bis.read(buf);

			}

			bos.flush();

		} catch (FileNotFoundException e) {

			resp.getWriter().write("请求的资源文件不存在....");

		} finally {

			if (bis != null) {

				bis.close();

				bis = null;

			}



			if (bos != null) {

				bos.close();

				bos = null;

			}

		}

               ......

  对上面代码中的 is的是否被关闭,

程序员A,程序员B,程序员C,程序员D,展开讨论:

 

程序员A说:该段代码运行完后,is不会关闭,应该在finally代码段中明确加入如下代码

if (is != null) {
      is.close();
      is = null;
}

 is才会被关闭。

 

---------------------------------------------------------------------------------------------------------------------------------------------------------------

程序员B说:该段代码运行完后,is是会被关闭的,下面是他的理由

 

从设计模式上看:

java.io.BufferedInputStream是java.io.InputStream的装饰类。

BufferedInputStream装饰一个 InputStream 使之具有缓冲功能,is要关闭只需要调用最终被装饰出的对象的 close()方法即可,因为它最终会调用真正数据源对象的 close()方法。

 

 

BufferedInputStream的close方法中对InputStream进行了关闭,下面是jdk中附带的源代码:

    public void close() throws IOException {
        byte[] buffer;
        while ( (buffer = buf) != null) {
            if (bufUpdater.compareAndSet(this, buffer, null)) {
                InputStream input = in;
                in = null;
                if (input != null)
                    input.close();
                return;
            }
            // Else retry in case a new buf was CASed in fill()
        }
 

他还把java.io.BufferedInputStream的api搬出来:


<!-- -->

close

public void close




()
           throws IOException




关闭此输入流并释放与该流关联的所有系统资源。

 

指定者:
接口 Closeable 中的 close
覆盖:
FilterInputStream 中的 close
抛出:
IOException - 如果发生 I/O 错误。
另请参见:
FilterInputStream.in

 

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

程序员C说:在我们不知道是否会关闭的情况下,最好是显式关闭。

 

 

-------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

 

 

大家说说自己的看法

 

你可能感兴趣的:(java,设计模式,jdk,C++,c)