原则:最好在任何时候使用InputStream或者OutputStream的时候,在finally中调用close()方法,显式关闭。

一个典型的示例

InputStream in = null;
try {in = acquireStream();...
} finally {if (in != null) in.close();
}

fianlly中的if (in != null) in.close();也可以用IOUtils.closeQuietly(in);代替,需要Apache Commons-IO

为什么需要调用

InputStream的作用是用来表示从不同数据源产生输入的类,这些数据源包括:

  • 字节数组
  • String对象
  • 文件
  • 管道
  • 一个由其他种类的流组成的序列,以便我们可以将他们收集合并到一个流内。
  • 其他数据源,如Internet连接等

通常不使用close会导致内存泄露,垃圾回收机制会回收,但是最好自己显式关闭,这并不是特别关键。

关键是当InputStream的数据源是文件或者Internet连接的时候。

OutputStream的作用是如FileOutStream,当不调用close的时候,不会将缓存刷入文件中。

InputStream的数据源是文件时

一个InputStream会韩勇一个极小的kernel资源,一个低级的file handle。
当打开文件时,将文件读入到InputStream,会对文件加锁。当你不考虑文件加锁。当你需要读取另一个文件的时候,会打开一个新的InputStream,kernel会分配另一个descriptor(文件流),一直累加,而一个进程的文件描述表是优先,到最后文件描述表将用被用完,所以为了以防万一,最好每次使用完之后都加一个close()

测试代码

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;public class TestInputStream {public static void main(String[] args) {
//        createTestFile();
//        testInputStreamWithOutClose();
//        testInputStreamWithOneFileWithOutClose();testInputStreamWithClose();}/*** 创建一万个测试文件*/public static void createTestFile() {try {for (int i = 0; i < 10000; i++) {FileOutputStream fos = new FileOutputStream(new File("/Users/shenpengyan/Documents/workspace/Test/testInputStream/Test" + i));fos.write(i);fos.close();}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}/*** 用不同文件,不使用close,有"Too many open files in system"报错*/public static void testInputStreamWithOutClose(){try {for (int i = 0; i < 10000; i++) {FileInputStream fis = new FileInputStream(new File("/Users/shenpengyan/Documents/workspace/Test/testInputStream/Test" + i));System.out.println(fis.toString() + " " + i);// fis.close();}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}/*** 用同一个文件,不加close,有"Too many open files in system"报错*/public static void testInputStreamWithOneFileWithOutClose(){try {for (int i = 0; i < 10000; i++) {FileInputStream fis = new FileInputStream(new File("/Users/shenpengyan/Documents/workspace/Test/testInputStream/Test1"));System.out.println(fis.toString() + " " + i);// fis.close();}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}/*** 加close,无"Too many open files in system"报错*/public static void testInputStreamWithClose(){try {for (int i = 0; i < 100000; i++) {FileInputStream fis = new FileInputStream(new File("/Users/shenpengyan/Documents/workspace/Test/testInputStream/Test1"));System.out.println(fis.toString() + " " + i);fis.close();}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

当不使用close()方法时,会有报错:Too many open files in system

java.io.FileInputStream@7e349a0e 6079
java.io.FileNotFoundException: /Users/shenpengyan/Documents/workspace/Test/testInputStream/Test1 (Too many open files in system)at java.io.FileInputStream.open(Native Method)at java.io.FileInputStream.<init>(FileInputStream.java:120)at TestInputStream.testInputStreamWithOneFileWithOutClose(TestInputStream.java:53)at TestInputStream.main(TestInputStream.java:9)
InputStream的数据源是Internet连接时

这是我实际遇到的情况,实际业务情况为:我需要调用一个图片存储位置,用key读到的图片存到InputStream里面来进行进一步处理,而我忘记了对它进行close,经过测试,处理300左右的请求之后,就不能继续请求了,这是为什么呢?是因为InputStream没有被垃圾回收掉,还一直占用着连接,而图片服务商有连接数限制,导致之后的请求没有返回,被调用的InputStream类如下:

import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.SocketException;import org.apache.http.client.methods.CloseableHttpResponse;public class ObjectInputStream extends FilterInputStream {private CloseableHttpResponse httpResponse;public ObjectInputStream(InputStream in, CloseableHttpResponse httpResponse) {super(in);this.httpResponse = httpResponse;}public void close() throws IOException {this.httpResponse.close();try {super.close();} catch (SocketException e) {// expected from some implementations because the stream is closed}}
}

当没有调用close方法的时候,没有调用httpResponse.close();,连接不会关掉,所以就尴尬了。

理论依据参考:http://stackoverflow.com/questions/26541513/why-is-it-good-to-close-an-inputstream

Java:浅谈InputStream的close方法相关推荐

  1. java关闭inputstream_Java:浅谈InputStream的close方法

    原则:最好在任何时候使用InputStream或者OutputStream的时候,在finally中调用close()方法,显式关闭. 一个典型的示例 InputStream in = null; t ...

  2. java中virtual关键字_浅谈virtual、abstract方法和静态方法、静态变量理解

    说点对这几个容易混淆的词的理解: 1.c++中的virtual方法的 virtual关键字主要是防止继承中重复继承父类的同一个方法而设置的标识. 2.virtual与abstract关键字的不同之处在 ...

  3. 浅谈JVM(六):方法调用过程

    上一篇: 浅谈JVM(一):Class文件解析 浅谈JVM(二):类加载机制 浅谈JVM(三):类加载器和双亲委派 浅谈JVM(四):运行时数据区 浅谈JVM(五):虚拟机栈帧结构 6.方法调用过程 ...

  4. 计算机节约ip,浅谈节约IP地址方法.doc

    浅谈节约IP地址的方法 刘荣欢 (理学院 信计0701 lrhbsym@126.com) 摘 要:随着Internet技术的发展及现代用户计算机的增多,原先以Ipv4标准的IP地址分配以存在严重的空间 ...

  5. java hexits,[Java]浅谈Java的异常体系

    为什么需要异常 理想的情况下,程序是不会有BUG的.但是现实的情况是:处处都可能引发BUG,比如一个糟糕的输入.需要访问的资源不存在.网络出现抖动.服务器资源不足等等.这就要求我们的程序需要一个机制来 ...

  6. [iOS、Unity、Android] 浅谈闭包的使用方法

    2019独角兽企业重金招聘Python工程师标准>>> 前言 我们经常所编程语言的的进步速度是落后于硬件的发展速度的. 但是最近几年,闭包语法在各个语言中都有自己的体现形式,例如 • ...

  7. java浅谈线程安全之锁

    在java锁的知识中,我们首先要知道分布式锁和本地锁的概念. 1.本地锁: 在单进程的系统中,存在多个线程去同时操作某个共享变量时,就需要使用本地锁,最常用的关键字:synchronized 2.分布 ...

  8. java:浅谈axis调用webservice接口

     [申明:此代码已经经过测试可以正确使用:但内容解释为个人见解,如有不准确之处,请指教.              阅读前请先仔细阅读"[]"中的说明文字,以免与您的需求不符而 ...

  9. 汇智动力学院——Java 浅谈数据结构和算法

    以前不管自己还是朋友在面试java工程师岗位的时候,都会被问到这样的问题: "介绍下java中的数据结构和算法", 很多朋友被问到的时候发现无从下口,甚至特别是一些初级java工程 ...

最新文章

  1. linux maven编译代码,git拉源码maven构建后部署脚本详解
  2. 如何通过一个类名找到它属于哪个jar包?
  3. 众筹课 | 电气系统运维培训报名啦
  4. 18M 超轻量系统开源
  5. scikit-learn 逻辑回归类库使用小结
  6. git 删除已add的文件夹_如何删除还没有被add到git的文件(git clean的用法)
  7. React开发(119):代码原因
  8. C++ 求一元二次方程的根
  9. java 中aop 博客园_Java 10.Spring--AOP编程
  10. Halcon学习路线——模板匹配和仿射变换
  11. java 静态变量锁_线程中锁方法和静态变量的锁
  12. gatedata graph digitier 基本使用
  13. Hybird接口的理解
  14. java指数运算_java算法-指数运算(大数运算)
  15. 八位知名设计师评iOS7:新鲜但复杂
  16. Oracle-基本SQL语句
  17. The type new ActionListener(){} must implement the inherited abstract method ActionListener.actionPe
  18. 如何使用Mojave将APFS卷上的MacOS Catalina Beta安装到双引导
  19. 【一周头条盘点】中国软件网(2017.12.11~2017.12.15)
  20. Anchor-free方法分类整理:阅读导航

热门文章

  1. office2003稿纸加载项的删除解决方法
  2. 如何提升w ndows10系统网速,怎么提升电脑网速win10
  3. 协议转换器(网关实现)
  4. python tree结构_Python入门篇-数据结构树(tree)篇
  5. zone web.cluster.zone/IN: NS ‘dns.web.cluster.web.cluster.zone‘ has no address records (A or AAAA)
  6. jQuery系列 第八章 jQuery框架Ajax模块
  7. 前端开发者如何规划并构建UCD的中长期前端开发能力与团队
  8. NodeJS之cluster模块
  9. 一文读懂EMC中分贝 (dB) 的含义
  10. html css绘制太极,css画太极阴阳图