`
lingshangwen
  • 浏览: 62523 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

会议室中讨论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对I/O流的处理

    Java中的I/O流处理是程序与外部设备交互数据的关键机制,包括从文件、网络、内存等数据源读取数据和向这些目标写入数据。I/O流系统在Java的`java.io`包中被实现,提供了丰富的类和接口来支持各种类型的流操作。 **I...

    Java I/O流通讯录

    Java I/O流通讯录是一个基于Java编程语言设计的实用程序,它主要用于演示和学习Java的I/O流操作。在这个项目中,开发者通过I/O流实现了对文件的读写功能,从而构建了一个简单的通讯录系统。这个系统允许用户进行添加...

    Java I/O 流代码实例大全(01~09)

    Java I/O 流代码实例大全(01~09) File、FileInputStream、FileOutputStream、FileReader、FileWriter、BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter

    Java I/O编程 java

    Java I/O 编程是Java开发中的重要组成部分,主要用于处理数据的输入与输出。下面将详细阐述其中的关键概念和方法。 1. 数据流的概念及输入输出方法: 数据流是计算机中进行数据传输的通道,包括从外部设备到程序的...

    java I/O内容

    这是一个关于Java I/O的知识点总结,希望大家共同学习,共同进步

    java i/o流读取写入字符流

    读取写入文件,javai/o流字符流 eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee

    深入分析 Java I/O 的工作机制(转载)

    过滤流(FilterStream)是Java I/O中的一种设计模式,它们在已存在的流之上添加额外功能。例如,DataInputStream和DataOutputStream扩展了字节流,增加了对基本类型数据的读写支持;而BufferedInputStream和...

    java数据流 I/O系统

    在Java中,I/O操作是通过数据流的概念来实现的。 数据流的基本概念涉及数据的流动方向和组织层次。数据流可以分为输入数据流和输出数据流,前者只能读取数据,后者只能写入数据。在Java中,`java.io`包提供了这些...

    Java I/O流及其应用详解:字节流、字符流及相关工具类全面解析

    内容概要:本文详细介绍了 Java中I/O流的概念、分类及具体实现方法。首先阐述了 I/O流的基础概念,强调其作为一种用于程序和外部设备(如文件、网络、内存等)间的数据传输方式。接着具体讲解了 I/O流的四种类别:...

    关于I/O流读写文件

    在Java中,I/O流是通过流的概念来实现的,流是一种抽象表示,用于表示输入设备或输出设备。根据不同的功能,I/O流可以分为输入流和输出流两种。 输入流 输入流是用于读取数据的流,常用的输入流有InputStream、...

    java阻塞i/o与非阻塞i/o控制

    在Java编程环境中,I/O(输入/输出)操作是程序与外部世界交互的关键部分,包括读取文件、网络通信等。对于高效的系统设计,理解并掌握阻塞I/O和非阻塞I/O是非常重要的。这两种I/O模型在处理数据传输时有着显著的...

    JAVA的I/O流对比示例测试

    在Java编程语言中,I/O流是用于处理设备之间数据传输的重要组成部分。它主要用于实现应用程序与外部数据源(文件、网络连接等)之间的通信。Java的I/O流系统非常丰富,主要分为两大类:字节流和字符流,以及后来引入...

    java i/o 实例 编程 学习 教程 复习

    Java I/O(输入/输出)是 Java 编程语言中处理数据流的核心技术之一。通过 I/O,我们可以读取文件、网络数据等外部资源,并将程序产生的数据写入到文件或网络等地方。Java 的 I/O 主要分为两大类:`InputStream` 和 ...

    Java I/O层次结构详解

    - **流(Stream)**:Java I/O中的流分为字节流(Byte Stream)和字符流(Character Stream)。字节流处理单个字节的数据,如InputStream和OutputStream家族;字符流处理Unicode字符,如Reader和Writer家族。 - **...

    JAVA面试基础篇章-I/O流

    Java的I/O流系统是Java语言中用于处理数据传输的核心机制,它支持各种数据源和目的地之间的数据读写操作。I/O流体系结构在文件操作和网络通信等场景中得到了广泛的应用。Java的I/O流可以分为两大类:字节流和字符流...

    Javaio流思维导图

    Java I/O 流是Java平台中的一个重要组成部分,它在处理数据输入和输出方面扮演着核心角色。I/O流系统提供了一种标准化的方式来读取、写入数据,无论是从磁盘、网络、内存还是其他类型的输入输出设备。在这个思维导图...

    Java I/O总结

    5. **装饰者模式的应用**:在Java I/O中,装饰者模式被广泛应用于构建复杂的流管道,如上文中提到的`BufferedReader`就是一个典型的例子,它装饰了一个`InputStreamReader`,后者又装饰了一个`InputStream`。...

    Java I/O 流代码实例大全(01~15)

    Java I/O 流代码实例大全(01~15) File、FileInputStream、FileOutputStream、FileReader、FileWriter、BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter、ByteArrayInputStream、...

    java_I/O流的教程

    Java I/O流是Java编程语言中的一个重要组成部分,用于在程序和外部资源(如磁盘、网络、内存等)之间传输数据。本教程涵盖了从基础到高级的Java流知识,包括文件读写、缓冲流、对象序列化等多个方面。 1. **文件的...

    Java I/O学习笔记: 磁盘操作 字节操作 字符操作 对象操作 网络操作 NIO & AIO Java I/O

    Java I/O学习笔记: 磁盘操作 字节操作 字符操作 对象操作 网络操作 NIO & AIO Java I/O Java是一种面向对象的编程语言,由Sun Microsystems于1995年推出。它是一种跨平台的语言,意味着可以在不同的操作系统上运行...

Global site tag (gtag.js) - Google Analytics