原则:最好在任何时候使用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 block

e.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 block

e.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 block

e.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 block

e.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.(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();,连接不会关掉,所以就尴尬了。

java关闭inputstream_Java:浅谈InputStream的close方法相关推荐

  1. Java:浅谈InputStream的close方法

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

  2. 猿来小课Java视频教程讲师浅谈JAVA体系结构

    猿来小课Java视频教程讲师:Java体系结构中不仅定义了Java的开发编译环境,也定义了Java的运行环境.为运行Java应用程序和applet,计算机上应安装JVM和Java运行时解释器,这两个部 ...

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

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

  4. java 定时任务怎么关闭_浅谈springboot项目中定时任务如何优雅退出

    在一个springboot项目中需要跑定时任务处理批数据时,突然有个Kill命令或者一个Ctrl+C的命令,此时我们需要当批数据处理完毕后才允许定时任务关闭,也就是当定时任务结束时才允许Kill命令生 ...

  5. java的throw_浅谈Java的throw与throws

    浅谈Java异常 以前虽然知道一些异常的处理,也用过一些,但是对throw和throws区别还是有不太清楚.今天用实例测试一下 异常处理机制 异常处理是对可能出现的异常进行处理,以防止程序遇到异常时被 ...

  6. java反射机制浅谈

    一.Java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动, ...

  7. scale和java比较_浅谈java中BigDecimal的equals与compareTo的区别

    这两天在处理支付金额校验的时候出现了点问题,有个金额比较我用了BigDecimal的equals方法来比较两个金额是否相等,结果导致金额比较出现错误(比如3.0与3.00的比较等). [注:以下所讲都 ...

  8. java 小偷_浅谈小偷程序之Java

    浅谈小偷程序之Java 题外话:如果用EditPlus作为编辑器的话如果保存的格式默认为unicode的话那么在里面写中文用resin作为应用服务器的话就可能出现报500 Servlet错误哦!主要是 ...

  9. java 线程aba,浅谈Java中ABA问题及避免,浅谈javaaba避免

    浅谈Java中ABA问题及避免,浅谈javaaba避免 本文主要研究的是关于Java中ABA问题及避免的相关内容,具体如下. 在<Java并发实战>一书的第15章中有一个用原子变量实现的并 ...

最新文章

  1. Dropout, DropConnect ——一个对输出,一个对输入
  2. CCIE试验备考之冗余备份VRRP
  3. Discovering Urban Functional Zones Using Latent Activity Trajectories TKDE 2015
  4. 计算机与生命科学交叉应用,第二届 “数学、计算机与生命科学交叉研究”青年学者论坛...
  5. Ajax(5)UpdatePanel的使用方法
  6. html首页 slider图片切换效果,jQuery插件Slider Revolution实现响应动画滑动图片切换效果...
  7. 计算机技术与自动化期刊官网,计算技术与自动化是什么级别
  8. Docker常用命令,这些都要会!
  9. 陕西神木市一煤矿发生冒顶事故 约20人被困井下
  10. 杭电acm 提交代码需要注意的问题
  11. AutoResetEvent和ManualResetEvent对比
  12. 大型网站架构技术一览(李智慧著.大型网站技术架构.附录A)
  13. [设计模式]行为模式-模板方法(C++描述)
  14. 中国支付清算协会发布《2022中国支付清算行业社会责任报告》
  15. 计算机网络:路由协议分类——IGP和EGP
  16. win10系统 删掉自带的输入法
  17. 【科技橙就新商业】淘系技术走进四川大学,讲述淘宝天猫的前端故事
  18. 奶块服务器维护多久,奶块为什么要更新维护 | 手游网游页游攻略大全
  19. Vue学习之认识到应用(三)
  20. 制作winpe ISO(x86/amd64/ARM)

热门文章

  1. 删除链表中的重复出现的结点,留下只出现一次的结点
  2. atd服务报错 Failed with result ‘exit-code‘
  3. JS之replaceState与pushState的妙用
  4. 交换机背板带宽(交换容量)与吞吐量(包转发率)
  5. 【项目管理一点通】(30) 安全架构
  6. Python实现文件的复制粘贴
  7. Segment Routing IGP Control Plane
  8. 2021-2027全球与中国面部脂肪注射市场现状及未来发展趋势
  9. 【笔记】【Informatica】Informatica 资料库迁移步骤
  10. 自动循迹小车系统方案设计(二)