apache commons fileupload 1.3.1(二)Util部分
2016-03-26 14:23
253 查看
近段时间,对apache commons fileupload的源码做了深入的了解,在此把一些见解与大家分享。
今天就简介一下commons fileupload的Util部分。
![](http://img.blog.csdn.net/20160326141547085?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
Util部分都是一些琐碎的工具类,在看源码的过程中,发现还是有许多优化空间,其主要由以下两部分组成:输入输出流部分、文件条目头信息部分。
但我们应该先来了解一下util所依赖的以下commons-fileupload或commons-io类:
org.apache.commons.io.IOUtils
通用输入输出流的便捷操作工具类,有许多静态的工具方法,主要有关闭流、读取流、写入流、两流间复制、两流内容是否相等。
字节转字符和字符转字节的方法,鼓励使用给定字符集编码的方法进行操作,这样对环境迁移如开发环境到运行环境能获得更好的支持。
该类中的方法都不会对流进行清洗或关闭,这样就不会影响调用处的使用。
org.apache.commons.fileupload.InvalidFileNameException
当文件名出现空格字符时抛出该异常。
org.apache.commons.fileupload.MultipartStream#ItemInputStream
用来读取FileItem的输入流。
org.apache.commons.fileupload.FileItemHeaders
该接口提供访问文件或表单元素头信息的功能。
输入输出流部分:
org.apache.commons.fileupload.util.Streams
输入输出流工具类
该类是输入输出流的工具类,其提供了一些基本的流操作,比如copy()、asString();
其在功能上与其所依赖的org.apache.commons.io.IOUtils类有重叠,比如说Streams.copy()方法完全可以由IOUtils.copy()所代替,他们之间的差异只是默认的缓存字节数组的大小不一致,但完全可以通过传参进行封装来解决这个问题,而且IOUtils.copy()的代码可读性比Streams.copy()更好;
而Streams.asString()也是可以由IOUtils.toString()所代替,他们的差异在于Streams.asString()会调用Streams.copy()将输入流的内容拷贝到ByteArrayOutputStream类型的输出流中,然后通过ByteArrayOutputStream.toString()方法转换为字符串,此处可以看到ByteArrayOutputStream.toString()方法是加了synchronized关键字。而IOUtils.toString()则是通过使用StreamDecoder.forInputStreamReader()将输入流转换为Reader然后传给Writer进行String输出,new
Reader的过程中也有synchronized关键字,但关键字加在了成员变量lock对象上。说了比较多直接出结论,ByteArrayOutputStream是java.io包的类,而StreamDecoder所涉及到的都是java.nio的类在性能上应该后者比较好,并且synchronized关键字加在对象上与加在方法上相比也肯定是加在对象上面好的。所以Streams.asString()被IOUtils.toString()所代替其实更好。
对比了一下两个类的注释,两个类都是由同一个作者所写,但Streams比IOUtils更新,其相隔两年之久,想必是作者忘了。
而Streams.checkFileName()方法则是查看了文件名是否有空格,如果有则抛出InvalidFileNameException;根据我所翻译过的《apache
commons io 最佳实践》(http://blog.csdn.net/houjx114/article/details/50561148)表示文件名应该使用能够File类而不是String类。因此可以断定调用Streams.checkFileName()的地方肯定都是需要优化的,将String类型转为使用File类型来表示文件名。
org.apache.commons.fileupload.util.Closeable
可关闭接口
该接口表示其实现类是可关闭的,其有两个方法,一个是close()方法进行关闭操作,另一个是isClosed()方法判断是否关闭。其与java.io.Closeable接口的差异在与java.io.Closeable只有close()方法。
org.apache.commons.fileupload.util.LimitedInputStream
阀值告警输入流
该类是一个有指定读取阀值大小的输入流,当超过读取阀值时将调用抽象的raiseError()进行回调。如果开发者没有实现raiseError()进行关闭流处理的话,该输入流还是可以继续读取的。
文件条目头信息部分:
org.apache.commons.fileupload.util.FileItemHeadersImpl
文件条目头信息实现类
该类是FileItemHeaders的实现类,它代理了一个Map<String, List<String>>来保存Headers。
ONE FOR IT是一个呆萌CTO打理的资讯读物,每天只为你准备一篇IT行业新鲜资讯。互联网的前沿,一篇就够了。(ID:OFI)
今天就简介一下commons fileupload的Util部分。
Util部分都是一些琐碎的工具类,在看源码的过程中,发现还是有许多优化空间,其主要由以下两部分组成:输入输出流部分、文件条目头信息部分。
但我们应该先来了解一下util所依赖的以下commons-fileupload或commons-io类:
org.apache.commons.io.IOUtils
通用输入输出流的便捷操作工具类,有许多静态的工具方法,主要有关闭流、读取流、写入流、两流间复制、两流内容是否相等。
字节转字符和字符转字节的方法,鼓励使用给定字符集编码的方法进行操作,这样对环境迁移如开发环境到运行环境能获得更好的支持。
该类中的方法都不会对流进行清洗或关闭,这样就不会影响调用处的使用。
org.apache.commons.fileupload.InvalidFileNameException
当文件名出现空格字符时抛出该异常。
org.apache.commons.fileupload.MultipartStream#ItemInputStream
用来读取FileItem的输入流。
org.apache.commons.fileupload.FileItemHeaders
该接口提供访问文件或表单元素头信息的功能。
输入输出流部分:
org.apache.commons.fileupload.util.Streams
输入输出流工具类
该类是输入输出流的工具类,其提供了一些基本的流操作,比如copy()、asString();
其在功能上与其所依赖的org.apache.commons.io.IOUtils类有重叠,比如说Streams.copy()方法完全可以由IOUtils.copy()所代替,他们之间的差异只是默认的缓存字节数组的大小不一致,但完全可以通过传参进行封装来解决这个问题,而且IOUtils.copy()的代码可读性比Streams.copy()更好;
而Streams.asString()也是可以由IOUtils.toString()所代替,他们的差异在于Streams.asString()会调用Streams.copy()将输入流的内容拷贝到ByteArrayOutputStream类型的输出流中,然后通过ByteArrayOutputStream.toString()方法转换为字符串,此处可以看到ByteArrayOutputStream.toString()方法是加了synchronized关键字。而IOUtils.toString()则是通过使用StreamDecoder.forInputStreamReader()将输入流转换为Reader然后传给Writer进行String输出,new
Reader的过程中也有synchronized关键字,但关键字加在了成员变量lock对象上。说了比较多直接出结论,ByteArrayOutputStream是java.io包的类,而StreamDecoder所涉及到的都是java.nio的类在性能上应该后者比较好,并且synchronized关键字加在对象上与加在方法上相比也肯定是加在对象上面好的。所以Streams.asString()被IOUtils.toString()所代替其实更好。
对比了一下两个类的注释,两个类都是由同一个作者所写,但Streams比IOUtils更新,其相隔两年之久,想必是作者忘了。
而Streams.checkFileName()方法则是查看了文件名是否有空格,如果有则抛出InvalidFileNameException;根据我所翻译过的《apache
commons io 最佳实践》(http://blog.csdn.net/houjx114/article/details/50561148)表示文件名应该使用能够File类而不是String类。因此可以断定调用Streams.checkFileName()的地方肯定都是需要优化的,将String类型转为使用File类型来表示文件名。
org.apache.commons.fileupload.util.Closeable
可关闭接口
该接口表示其实现类是可关闭的,其有两个方法,一个是close()方法进行关闭操作,另一个是isClosed()方法判断是否关闭。其与java.io.Closeable接口的差异在与java.io.Closeable只有close()方法。
org.apache.commons.fileupload.util.LimitedInputStream
阀值告警输入流
该类是一个有指定读取阀值大小的输入流,当超过读取阀值时将调用抽象的raiseError()进行回调。如果开发者没有实现raiseError()进行关闭流处理的话,该输入流还是可以继续读取的。
文件条目头信息部分:
org.apache.commons.fileupload.util.FileItemHeadersImpl
文件条目头信息实现类
该类是FileItemHeaders的实现类,它代理了一个Map<String, List<String>>来保存Headers。
ONE FOR IT是一个呆萌CTO打理的资讯读物,每天只为你准备一篇IT行业新鲜资讯。互联网的前沿,一篇就够了。(ID:OFI)
相关文章推荐
- Apache Cordova for ios环境配置
- Apache Cordova开发环境搭建(一)-Visual Studio
- 配置 Visual Studio Tools for Apache Cordova
- ActiveMQ 的使用
- Apache Kylin (v1.5.0) 发布,全新设计的新一代
- win10不能启动apache该怎么解决?
- apache camel 条件路由
- org/apache/hadoop/hive/cli/CliDriver : Unsupported major.minor version 51.0
- PHP每日学习记录——PHP、APACHE、MYSQL的安装
- Maven 遇到mybatis 发生org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):
- Apache Arrow源码分析(一)——简介和框架
- apache服务安装
- Apache Maven 入门篇(下)
- Apache Maven 入门篇 ( 上 )
- apache的工作模式prefork和worker理解
- org.apache.hadoop.hbase.TableExistsException: hbase:namespace
- Apache Hadoop源代码
- apache commons fileupload 1.3.1(一)Mime部分
- 升级Apache到最新版
- phpstudy中apache或mysql无法启动