近段时间,对apache commons io的源码做了深入的了解,在此把一些见解与大家分享。
首先我选择了大部分框架还依赖的2.2版本而不是最新的2.4版本(2.5发行版还没有发布)进行源码的研读,今天就简介一下commons io的output部分。
Output部分并不复杂,只是功能较多,主要由以下十二部分组成:通用部分、异常输出流标记、计数器相关功能、关闭输出流相关功能、三通相关功能、XML相关功能、流间对接相关功能、测试流相关功能、线程绑定部分、阀值输出部分、文件锁相关功能、字符集相关功能。
但我们应该先来了解一下ouyput所依赖的以下commons-io类:
org.apache.commons.io.FileUtils
文件工具类,该类只使用了它的判断文件新旧功能。
有写文件、读文件、创建文件夹、复制文件/文件夹、删除文件/文件夹、从URL中获取文件、遍历后显示文件集结果、比较文件内容、修改文件最后修改时间、检查文件正确性,这些功能。
org.apache.commons.io.IOUtils
通用输入输出流的便捷操作工具类,有许多静态的工具方法,主要有关闭流、读取流、写入流、两流间复制、两流内容是否相等。
字节转字符和字符转字节的方法,鼓励使用给定字符集编码的方法进行操作,这样对环境迁移如开发环境到运行环境能获得更好的支持。
该类中的方法都不会对流进行清洗或关闭,这样就不会影响调用处的使用。
org.apache.commons.io.TaggedIOException
可添加标记的IO异常。可以通过标记来确认是哪一个输入输出流引起的。
org.apache.commons.io.input.XmlStreamReader
该类实现了从一个URL或字节输入流读取字符的功能,并可猜测其字符集编码,但不一定是正确的。
其中org.apache.commons.io.output.XmlStreamWriter使用了XmlStreamReader中判断是否为xml内容的正则表达式。
org.apache.commons.io.input.CloseInputStream
该类用于那些不方便关闭却又不希望该输入流在部分代码中被使用的情况,调用该类的read方法永远都返回-1。
其中org.apache.commons.io.output.ByteArrayOutputStream在发现没有内容需要输出时会将代理的InputStream赋值为CloseInputStream。
通用部分:
org.apache.commons.io.output.ProxyOutputStream
该类是一个超类,使用代理模式代理了一个FilterOutputStream类,主要提供了beforeWrite()前置增强、afterWrite()后置增强、handleIOException()异常处理增强。由于该类是抽象类,因此各增强没有具体实现。
org.apache.commons.io.output.ProxyWriter
该类是一个超类,使用代理模式代理了一个FilterWriter类,主要提供了beforeWriter()前置增强、afterWriter()后置增强、handleIOException()异常处理增强。由于该类是抽象类,因此各增强没有具体实现。
异常输出流标记:
org.apache.commons.io.output.TaggedOutputStream
该类使用TaggedIOException异常进行输出流的异常标记。
计数器相关功能:
org.apache.commons.io.output.CountingOutputStream
该类在写入字节时进行计数,可统计所写入字节的数量。
关闭输出流相关功能:
org.apache.commons.io.output.CloseShieldOutputStream
该类重写了close方法,当用户close时替换代理类为CloseOutputStream。这样做可以避免close掉原输出流,因此叫关闭防御输出流。
org.apache.commons.io.output.CloseOutputStream
该类用于那些不方便关闭却又不希望该输出流在部分代码中被使用的情况,调用该类的write方法永远都抛出异常。
三通相关功能:
org.apache.commons.io.output.TeeOutputStream
该类实现了一入两出的三通字节输出流,由调用处作为其中一个输出、代理的outputStream作为第二个输出,从而实现三通。
XML相关功能:
org.apache.commons.io.output.XmlStreamWriter
该类实现了从一个URL或字节输出流读取字符的功能,并可猜测其字符集编码,但不一定是正确的。
流间对接相关功能:
org.apache.commons.io.output.StringBuilderWriter
该类将写入数据输出到StringBuilder中,但该类不是线程安全的。在单线程中该类的效率比StringWriter更高。
org.apache.commons.io.output.ByteArrayOutputStream
该类可将通过InputStream或单个字节单个字节输入的字节串转换为字节数组输出。其中一个使用场景是将缓冲区中的字节串输出。
org.apache.commons.io.output.WriterOutputStream
该类同时代理了一个Writer和一个OutputStream,并通过向输出流写入数据后根据指定的字符集编码写入到Writer中。
测试流相关功能:
org.apache.commons.io.output.BrokenOutputStream
该类在重载OutputSream的各个方法时都进行抛出IOException的处理,并且为了更准确地提供错误信息,可以在实例化对象时传IOException的子类对象作为异常抛出的对象。该类主要用于出错时的异常处理。
org.apache.commons.io.output.NullOutputStream
该类是测试时使用的桩输出流类。例如测试时输出流数据量比较大则可使用该类进行测试,该类write()方法没有方法体,在使用时需要重写该方法,如写入时无改变。
org.apache.commons.io.output.NullWriter
该类是测试时使用的桩写入器类。例如测试时写入器数据量比较大则可使用该类进行测试,该类write()方法没有方法体,在使用时需要重写该方法,如写入时无改变。
线程绑定部分:
org.apache.commons.io.output.DemuxOutputStream
该类会将所代理的输出流绑定到当前线程上,只要是基于当前线程以及其子线程的都可以同步访问该输出流。其实现是通过ThreadLocal进行实现的。
阀值输出部分:
org.apache.commons.io.output.ThresholdingOutputStream
该类是阀值输出流的超类,其通过成员变量实现了阀值的判断等操作,当用时想使用阀值功能时,需覆写getStream()方法以提供输出流。
org.apache.commons.io.output.DeferredFileOutputStream
该类实现了一个带阀值的文件输出流,其内部有一个ByteArrayOutputStream来缓存写入的字节串,但字节流长度未到达阀值时可暂存内存中(通过ByteArrayOutputStream实现缓存),如果达到阀值则将缓存持久化到文件中。
org.apache.commons.io.output.LockableFileWriter
该类代替FileWriter的文件锁功能,实现更简单的文件锁(使用锁文件实现),首先将要写入的文件备份到锁文件,然后将原文件改为不可写,写入操作对锁文件进行。当写入完毕之后使用锁文件覆盖原文件并删除掉锁文件以完成文件锁。
字符集相关功能:
org.apache.commons.io.output.FileWriterWithEncoding
该类实现一个带字符集编码的字符输出流,对该字符输出流输出内容可根据字符集编码自动转换。
ONE FOR IT是一个呆萌CTO打理的资讯读物,每天只为你准备一篇IT行业新鲜资讯。互联网的前沿,一篇就够了。(ID:OFI)