`
lingshangwen
  • 浏览: 61995 次
  • 性别: 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

    Java 新I/O,也称为NIO(New Input/Output),是Java平台中对传统I/O模型的一种改进。在Java 1.4版本中引入的NIO库为开发人员提供了更高效、非阻塞的数据处理方式,特别适用于高并发、低延迟的系统。NIO的核心在于...

    Java I/O 过滤流-带格式的读写操作

    本篇文章将深入探讨Java I/O中的过滤流,以及如何利用它们进行带格式的读写操作。 过滤流是一种特殊的流,它不直接与原始数据源或目的地交互,而是建立在其他流之上,对数据进行处理或添加额外功能。Java I/O库中的...

    Java I/O编程 java

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

    java I/O类的使用

    Java 1.0 和 1.1 中的I/O类主要是基于两个基础类:`InputStream`和`OutputStream`,它们处理字节流。`InputStream`家族包括了如`ByteArrayInputStream`、`FileInputStream`等,它们分别从字节数组或文件中读取数据。...

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

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

    java数据流 I/O系统

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

    java I/O流总结

    这是一篇关于javaSe的基础班关于IO流的全套总结,希望能对你的基础学习有所帮助。

    关于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 主要分为两大类:`InputStream` 和 ...

    Java I/O层次结构详解

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

    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学习笔记: 磁盘操作 字节操作 字符操作 对象操作 网络操作 NIO & AIO Java I/O

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

    Java I/O文件读写/删除/复制等

    Java I/O 文件操作是Java编程中的重要组成部分,它允许开发者处理输入和输出,涉及文件的创建、读取、写入、删除以及复制等任务。在Java中,这些操作主要是通过java.io包提供的类来实现的。下面将详细介绍这些知识点...

    javaI/O示例---简易聊天程序代码

    一个java输入输出流的小例子,适合初学者

    I/O流复制文档或者歌曲等

    Java I/O字符流复制文档,字节流复制歌曲等 自己定义

Global site tag (gtag.js) - Google Analytics