您的位置:首页 > 运维架构 > Apache

apache commons fileupload 1.3.1(二)Util部分

2016-03-26 14:23 253 查看
近段时间,对apache commons fileupload的源码做了深入的了解,在此把一些见解与大家分享。

今天就简介一下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)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: