博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java IO: 其他字符流(下)
阅读量:6928 次
发布时间:2019-06-27

本文共 2883 字,大约阅读时间需要 9 分钟。

本小节会简要概括Java IO中的PushbackReader,LineNumberReader,StreamTokenizer,PrintWriter,StringReader,StringWriter。

PushbackReader

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

PushbackReader reader = new PushbackReader(new FileReader("c:\\data\\input.txt"));int data = reader.read();reader.unread(data);

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

PushbackReader reader = new PushbackReader(new FileReader("c:\\data\\input.txt"), 8);

LineNumberReader

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

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

LineNumberReader reader = new LineNumberReader(new FileReader("c:\\data\\input.txt"));int data = reader.read();while(data != -1){    char dataChar = (char) data;    data = reader.read();    int lineNumber = reader.getLineNumber();}

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

StreamTokenizer

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

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

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

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

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

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

代码如下:

StreamTokenizer tokenizer = new StreamTokenizer(new StringReader("Mary had 1 little lamb..."));while(tokenizer.nextToken() != StreamTokenizer.TT_EOF){    if(tokenizer.ttype == StreamTokenizer.TT_WORD) {        System.out.println(tokenizer.sval);    } else if(tokenizer.ttype == StreamTokenizer.TT_NUMBER) {        System.out.println(tokenizer.nval);    } else if(tokenizer.ttype == StreamTokenizer.TT_EOL) {        System.out.println();    }}

译者注:TT_EOF表示流末尾,TT_EOL表示行末尾。

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

PrintWriter

与类似,PrintWriter可以把格式化后的数据写入到底层writer中。由于内容相似,不再赘述。

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

StringReader

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

Reader reader = new StringReader("input string...");int data = reader.read();while(data != -1) {    //do something with data...    doSomethingWithData(data);    data = reader.read();}reader.close();

StringWriter

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

StringWriter writer = new StringWriter();//write characters to writer.String data = writer.toString();StringBuffer dataBuffer = writer.getBuffer();

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

getBuffer()方法能够获取StringWriter内部构造字符串时所使用的StringBuffer对象。

  • 转载自 
你可能感兴趣的文章
React as a UI Runtime(二、React元素和入口)
查看>>
Spring校验@RequestParams和@PathVariables参数
查看>>
安装lnmp 时如何修改数据库数据存储地址及默认访问地址
查看>>
React学习笔记2---生命周期
查看>>
NGINX 4xx 5xx 状态码构造
查看>>
利用 Webpack 实现小程序多项目管理
查看>>
用element的upload组件实现多图片上传和压缩
查看>>
吐槽Javascript系列三:数组的陷阱
查看>>
Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
查看>>
JS每日一题:Vue-router有哪些钩子?使用场景?
查看>>
NGINX HTTP2 处理流程
查看>>
【跃迁之路】【734天】程序员高效学习方法论探索系列(实验阶段491-2019.2.24)...
查看>>
CAP 一致性协议及应用解析
查看>>
前嗅ForeSpider数据建表和高级配置界面介绍
查看>>
【分享创造】react-typewriter-hook: 用react hooks来实现打字机的效果
查看>>
纯css实现叉号
查看>>
我的最佳写作方式
查看>>
用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
查看>>
PHP面试之网络协议面试题
查看>>
JS系列之防抖节流
查看>>