您的位置:首页 > 编程语言 > Java开发

Java IO浅谈(个人感觉例子不错,替换流,数组,文件或者大的字符串中的一些字符或者字符串)

2017-03-17 16:30 671 查看
人生之路慢慢长 2017-02-08 18:05

最近在看Java的IO,边学边记录分享下。

IO流的分类

根据数据处理类的不同分为:字符流和字节流

根据数据流向不同分为:输入流和输出流

字符流和字节流

区别:

读写单位不同,字节流以字节为单位,字符流以字符为单位

处理对象不同:字节流能处理所有类型数据,字符流只能处理字符类型的数据

字节流操作不会用到缓冲区,是对文件本身的操作,字符流是通过缓冲区来操作文件

管道

Java IO中的管道为运行在同一个JVM中的两个线程提供了通信的能力。所以管道也可以作为 数据源以及目标媒介。

在Java中,通信的双方应该是运行在同一进程中的不同线程。

可以通过Java IO中的PipedOutputStream和PipedInputStream创建管道。一个PipedInputStream流应该和一个PipedOutputStream流相关联。一个线程通过PipedOutputStream写入的数据可以被另一个线程通过相关联的PipedInputStream读取出来。

组合流

你可以将流整合起来以便实现更高级的输入和输出操作。比如,一次读取一个字节是很慢的,所以可以从磁盘中一次读取一大块数据,然后从读到的数据块中获取字节。为了实现缓冲,可以把InputStream包装到BufferedInputStream中。

TokenReplacingReader

有时你需要替换流,数组,文件或者大的字符串中的一些字符或者字符串,此时你可以使用String.replace()方法,但是对于大数据并且要替换许多处地方,这个方法就不那么好了。因为这个方法在每次替换会创建一个已经替换过字符的新的字符串,多次替换也就会创建多次,显然这份影响效率,那么TokenReplacingReader的重要性就凸显出来啦。

TokenReplacingReader从标准的Java.io.Reader中读取字符数据,然后你可以从TokenReplacingReader中读取数据,就可以得到用新字符替换过的数据。实际上这里面的处理是:当TokenReplacingReader在数据中找到诸如${tokenName}形式的口令字符串时,就会调用ITokenResolver获取应该要替换成的值来将对应口令字符串部分替换并插入到字符流中。那么ITokenResolver是什么呢?ITokenResolver是一个你可以自己实现的接口,这样的话你自己就可以定义所需要的口令字符串解析器,完成你的替换操作,其中口令字符串是通过ITokenResolver.resolveToken(String
tokenName)方法传入的。

下面是TokenReplacingReader的工作原理图:



TokenReplacingReader能够在字符流中替换字符串

说再多不如看例子:



输入字符串中的两个口令标识符${token1}和${token2}会被value1和JJ ROCKS!!!替换,这些值是由MapTokenResolver返回,其中MapTokenResolver是ITokenResolver的一种通过在Map中查询口令字符串来解析值的实现。

下面来比较下String.replace()和TokenReplacingReader的效能吧,时间复杂度上:

String.replace():O(N * M)

TokenReplacingReader:O(N + M)

效能显而易见。

总之,IO内容还是很多的,就先介绍这么多吧,谢谢大家。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐