Apache common-io AutoCloseInputStream 分析
Apache common-io 包是常用的工具包,他提供了对IO操作的一些封装。首先看一下input包下的 AutoCloseInputStream 类
1: * This class is typically used to release any resources related to an open
2: * stream as soon as possible even if the client application (by not explicitly
3: * closing the stream when no longer needed) or the underlying stream (by not
4: * releasing resources once the last byte has been read) do not do that.
5: *
6: * @version $Id: AutoCloseInputStream.java 1304052 2012-03-22 20:55:29Z ggregory $
7: * @since 1.4
8: */
9: public class AutoCloseInputStream extends ProxyInputStream
这个类的作用是自动关闭使用的流,具体的实现是每次 read 的时候,都判断一下是否返回的是 -1,是就立马关闭。
@Override
    protected void afterRead(int n) throws IOException {
        if (n == -1) {
close();
}
}
实现非常简单,但是这里提供了一个非常好的设计。首先,实现了一个抽象类ProxyInputStream,继承该类,通过集成该抽象类,只需要很简单重写 afterRead 类就可以达到每次read 都判断是否应该关闭。

在ProxyInputStream中的所有read方法中,在read之前之后分别调用 beforeRead 以及 afterRead方法,这样在之类中通过覆写 beforeRead 以及 afterRead方法,来做我们想做的事情。
    protected void beforeRead(int n) throws IOException {
}
    protected void afterRead(int n) throws IOException {
}
@Override
    public int read() throws IOException {
        try {
beforeRead(1);
int b = in.read();
afterRead(b != -1 ? 1 : -1);
return b;
        } catch (IOException e) {
handleIOException(e);
return -1;
}
}
@Override
    public int read(byte[] bts, int off, int len) throws IOException {
        try {
beforeRead(len);
int n = in.read(bts, off, len);
afterRead(n);
return n;
        } catch (IOException e) {
handleIOException(e);
return -1;
}
}
所以在AutoCloseInputStream 中,只通过重写了 afterRead方法,每次read都判断是否为 –1 ,是则关闭流。
Apache common-io AutoCloseInputStream 分析的更多相关文章
- .apache.commons.io 源代码学习(二)FilenameUtils类
		FilenameUtils是apache common io中一个独立的工具类,对其他没有依赖,看其源代码的import即可知道. import java.io.File;import java.io ... 
- apache commons io包基本功能
		1. http://jackyrong.iteye.com/blog/2153812 2. http://www.javacodegeeks.com/2014/10/apache-commons-io ... 
- IO与文件读写---使用Apache commons IO包提高读写效率
		觉得很不错,就转载了, 作者: Paul Lin 首先贴一段Apache commons IO官网上的介绍,来对这个著名的开源包有一个基本的了解:Commons IO is a library of ... 
- apache commons io入门
		原文参考 http://www.javacodegeeks.com/2014/10/apache-commons-io-tutorial.html Apache Commons IO 包绝对是 ... 
- org.apache.common.io-FileUtils详解
		org.apache.common.io---FileUtils详解 getTempDirectoryPath():返回临时目录路径; public static String getTempDire ... 
- java.lang.NoClassDefFoundError: org/apache/commons/io/output/DeferredFileOutputStream(转)
		java.lang.NoClassDefFoundError: org/apache/commons/io/output/DeferredFileOutputStream 使用Tomcat的Manag ... 
- .apache.commons.io 源代码学习(一)
		java的初学者,准备通读各种高水平源代码,提升能力. 为了避免自己的惰性,写博客. 版本:2.5 开发平台:netbeans. 今天是第一天,网上先看个例子:http://www.importnew ... 
- WEB文件上传之apache common upload使用(一)
		文件上传一个经常用到的功能,它有许多中实现的方案. 页面表单 + RFC1897规范 + http协议上传 页面控件(flash/html5/activeX/applet) + RFC1897规范 + ... 
- [解决]Hadoop 2.4.1 UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0
		问题:UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0 我的系统 win7 64位 Hadoop ... 
- SEQ!org.apache.hadoop.io.LongWritable
		[uhadoop@10-13-109-236 subdir26]$ $HADOOP_HOME/bin/hadoop fs -cat /data/flumeEvents/FlumeData.155980 ... 
随机推荐
- springboot整合fastdfs
			首先pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="h ... 
- 前端优化系列之一:dns预获取 dns-prefetch 提升页面载入速度
			问题:怎么做到dns域解析? 用于优化网站页面的图片 问题:怎么提升网站性能? dns域解析,是提升网站的一个办法. DNS Prefetch,即DNS预获取,是前端优化的一部分. 一般来 ... 
- MYSQL常用命令笔记(一)
			1.show databases; 显示数据库 2.create database test; 创建数据库test 3.use test: 使用这个数据库 4.创建表class: create tab ... 
- 何为 “元组”(Tuple)?
			元组是关系数据库中的基本概念,关系是一张表,表中的每行(即数据库中的每条记录)就是一个元组,每列就是一个属性. 在二维表里,元组也称为记录. 
- P2913 [USACO08OCT]车轮旋转Wheel Rotation
			传送门 初始状态是 0,如果有 1 的连接,0 就变 1,如果还有 1 的连接,1 就变 0,如果是 0 的连接就不变 所以就是把答案异或上所有连接,不用考虑顺序,反正最终是一样的 #include& ... 
- css过渡transition
			定义 过渡transition是一个复合属性,包括transition-property.transition-duration.transition-timing-function.transiti ... 
- php内置web server
			今天刚开始正式学习PHP(之前有一点了解),推荐学习的网站是w3school.一开始不知道tomcat服务器不支持PHP脚本,直接把.php文件放到tomcat里面去运行,结果嵌入的php代码段没有什 ... 
- hdu1387 模拟队列
			Team Queue Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ... 
- md5,base64加密
			import java.security.MessageDigest; import org.apache.commons.codec.binary.Base64;import org.apache. ... 
- python练习六十八:字符串练习
			题目:一个商城在搞抽奖的活动,需要在搞活动的宣传单上印刷优惠卷的验证码,验证码规定20位,生成100个 先来个简单的,20位码中只取数字 import random def num_1(num): l ... 
