天天看点

Java IO: 其他字符流(下)

本小节会简要概括java io中的pushbackreader,linenumberreader,streamtokenizer,printwriter,stringreader,stringwriter。

<a href="http://tutorials.jenkov.com/java-io/pushbackreader.html">原文链接</a>

pushbackreader与pushbackinputstream类似,唯一不同的是pushbackreader处理字符,pushbackinputstream处理字节。代码如下:

同样可以设置缓冲区大小,代码如下:

<a href="http://tutorials.jenkov.com/java-io/linenumberreader.html">原文链接</a>

linenumberreader是记录了已读取数据行号的bufferedreader。默认情况下,行号从0开始,当linenumberreader读取到行终止符时,行号会递增(译者注:换行\n,回车\r,或者换行回车\n\r都是行终止符)。

你可以通过getlinenumber()方法获取当前行号,通过setlinenumber()方法设置当前行数(译者注:setlinenumber()仅仅改变linenumberreader内的记录行号的变量值,不会改变当前流的读取位置。流的读取依然是顺序进行,意味着你不能通过setlinenumber()实现流的跳跃读取)。代码如下:

如果解析的文本有错误,linenumberreader可以很方便地定位问题。当你把错误报告给用户时,如果能够同时把出错的行号提供给用户,用户就能迅速发现并且解决问题。

<a href="http://tutorials.jenkov.com/java-io/streamtokenizer.html">原文链接</a>

streamtokenizer(译者注:请注意不是stringtokenizer)可以把输入流(译者注:inputstream和reader。通过inputstream构造streamtokenizer的构造函数已经在jdk1.1版本过时,推荐将inputstream转化成reader,再利用此reader构造stringtokenizer)分解成一系列符号。比如,句子”mary had a little lamb”的每个单词都是一个单独的符号。

当你解析文件或者计算机语言时,为了进一步的处理,需要将解析的数据分解成符号。通常这个过程也称作分词。

通过循环调用nexttoken()可以遍历底层输入流的所有符号。在每次调用nexttoken()之后,streamtokenizer有一些变量可以帮助我们获取读取到的符号的类型和值。这些变量是:

ttype 读取到的符号的类型(字符,数字,或者行结尾符)

sval 如果读取到的符号是字符串类型,该变量的值就是读取到的字符串的值

nval 如果读取到的符号是数字类型,该变量的值就是读取到的数字的值

代码如下:

译者注:tt_eof表示流末尾,tt_eol表示行末尾。

streamtokenizer可以识别标示符,数字,引用的字符串,和多种注释类型。你也可以指定何种字符解释成空格、注释的开始以及结束等。在streamtokenizer开始解析之前,所有的功能都可以进行配置。请查阅官方文档获取更多信息。

<a href="http://tutorials.jenkov.com/java-io/printwriter.html">原文链接</a>

值得一提的是,printwriter有更多种构造函数供使用者选择,除了可以输出到文件、writer以外,还可以输出到outputstream中(译者注:printstream只能把数据输出到文件和outputstream)。

<a href="http://tutorials.jenkov.com/java-io/stringreader.html">原文链接</a>

stringreader能够将原始字符串转换成reader,代码如下:

<a href="http://tutorials.jenkov.com/java-io:-stringwriter.html">原文链接</a>

stringwriter能够以字符串的形式从writer中获取写入到其中数据,代码如下:

tostring()方法能够获取stringwriter中的字符串数据。

getbuffer()方法能够获取stringwriter内部构造字符串时所使用的stringbuffer对象。