java关闭inputstream_Java:浅谈InputStream的close方法
原则:最好在任何时候使用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方法相关推荐
- Java:浅谈InputStream的close方法
原则:最好在任何时候使用InputStream或者OutputStream的时候,在finally中调用close()方法,显式关闭. 一个典型的示例 InputStream in = null; t ...
- 猿来小课Java视频教程讲师浅谈JAVA体系结构
猿来小课Java视频教程讲师:Java体系结构中不仅定义了Java的开发编译环境,也定义了Java的运行环境.为运行Java应用程序和applet,计算机上应安装JVM和Java运行时解释器,这两个部 ...
- java中virtual关键字_浅谈virtual、abstract方法和静态方法、静态变量理解
说点对这几个容易混淆的词的理解: 1.c++中的virtual方法的 virtual关键字主要是防止继承中重复继承父类的同一个方法而设置的标识. 2.virtual与abstract关键字的不同之处在 ...
- java 定时任务怎么关闭_浅谈springboot项目中定时任务如何优雅退出
在一个springboot项目中需要跑定时任务处理批数据时,突然有个Kill命令或者一个Ctrl+C的命令,此时我们需要当批数据处理完毕后才允许定时任务关闭,也就是当定时任务结束时才允许Kill命令生 ...
- java的throw_浅谈Java的throw与throws
浅谈Java异常 以前虽然知道一些异常的处理,也用过一些,但是对throw和throws区别还是有不太清楚.今天用实例测试一下 异常处理机制 异常处理是对可能出现的异常进行处理,以防止程序遇到异常时被 ...
- java反射机制浅谈
一.Java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动, ...
- scale和java比较_浅谈java中BigDecimal的equals与compareTo的区别
这两天在处理支付金额校验的时候出现了点问题,有个金额比较我用了BigDecimal的equals方法来比较两个金额是否相等,结果导致金额比较出现错误(比如3.0与3.00的比较等). [注:以下所讲都 ...
- java 小偷_浅谈小偷程序之Java
浅谈小偷程序之Java 题外话:如果用EditPlus作为编辑器的话如果保存的格式默认为unicode的话那么在里面写中文用resin作为应用服务器的话就可能出现报500 Servlet错误哦!主要是 ...
- java 线程aba,浅谈Java中ABA问题及避免,浅谈javaaba避免
浅谈Java中ABA问题及避免,浅谈javaaba避免 本文主要研究的是关于Java中ABA问题及避免的相关内容,具体如下. 在<Java并发实战>一书的第15章中有一个用原子变量实现的并 ...
最新文章
- Dropout, DropConnect ——一个对输出,一个对输入
- CCIE试验备考之冗余备份VRRP
- Discovering Urban Functional Zones Using Latent Activity Trajectories TKDE 2015
- 计算机与生命科学交叉应用,第二届 “数学、计算机与生命科学交叉研究”青年学者论坛...
- Ajax(5)UpdatePanel的使用方法
- html首页 slider图片切换效果,jQuery插件Slider Revolution实现响应动画滑动图片切换效果...
- 计算机技术与自动化期刊官网,计算技术与自动化是什么级别
- Docker常用命令,这些都要会!
- 陕西神木市一煤矿发生冒顶事故 约20人被困井下
- 杭电acm 提交代码需要注意的问题
- AutoResetEvent和ManualResetEvent对比
- 大型网站架构技术一览(李智慧著.大型网站技术架构.附录A)
- [设计模式]行为模式-模板方法(C++描述)
- 中国支付清算协会发布《2022中国支付清算行业社会责任报告》
- 计算机网络:路由协议分类——IGP和EGP
- win10系统 删掉自带的输入法
- 【科技橙就新商业】淘系技术走进四川大学,讲述淘宝天猫的前端故事
- 奶块服务器维护多久,奶块为什么要更新维护 | 手游网游页游攻略大全
- Vue学习之认识到应用(三)
- 制作winpe ISO(x86/amd64/ARM)
热门文章
- 删除链表中的重复出现的结点,留下只出现一次的结点
- atd服务报错 Failed with result ‘exit-code‘
- JS之replaceState与pushState的妙用
- 交换机背板带宽(交换容量)与吞吐量(包转发率)
- 【项目管理一点通】(30) 安全架构
- Python实现文件的复制粘贴
- Segment Routing IGP Control Plane
- 2021-2027全球与中国面部脂肪注射市场现状及未来发展趋势
- 【笔记】【Informatica】Informatica 资料库迁移步骤
- 自动循迹小车系统方案设计(二)