作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com)
本小节会简要概括Java IO中的PushbackReader,LineNumberReader,StreamTokenizer,PrintWriter,StringReader,StringWriter。
PushbackReader
原文链接
PushbackReader与PushbackInputStream类似,唯一不同的是PushbackReader处理字符,PushbackInputStream处理字节。代码如下:
| 1 | PushbackReader reader = newPushbackReader(newFileReader("c:\\data\\input.txt")); | 
 
| 3 | intdata = reader.read(); | 
 
 
 
同样可以设置缓冲区大小,代码如下:
| 1 | PushbackReader reader = newPushbackReader(newFileReader("c:\\data\\input.txt"), 8); | 
 
 
 
LineNumberReader
原文链接
LineNumberReader是记录了已读取数据行号的BufferedReader。默认情况下,行号从0开始,当LineNumberReader读取到行终止符时,行号会递增(译者注:换行\n,回车\r,或者换行回车\n\r都是行终止符)。
你可以通过getLineNumber()方法获取当前行号,通过setLineNumber()方法设置当前行数(译者注:setLineNumber()仅仅改变LineNumberReader内的记录行号的变量值,不会改变当前流的读取位置。流的读取依然是顺序进行,意味着你不能通过setLineNumber()实现流的跳跃读取)。代码如下:
| 01 | LineNumberReader reader = newLineNumberReader(newFileReader("c:\\data\\input.txt")); | 
 
| 03 | intdata = reader.read(); | 
 
| 07 |     chardataChar = (char) data; | 
 
| 11 |     intlineNumber = 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 如果读取到的符号是数字类型,该变量的值就是读取到的数字的值
代码如下:
| 01 | StreamTokenizer tokenizer = newStreamTokenizer(newStringReader("Mary had 1 little lamb...")); | 
 
| 03 | while(tokenizer.nextToken() != StreamTokenizer.TT_EOF){ | 
 
| 05 |     if(tokenizer.ttype == StreamTokenizer.TT_WORD) { | 
 
| 07 |         System.out.println(tokenizer.sval); | 
 
| 08 |     } elseif(tokenizer.ttype == StreamTokenizer.TT_NUMBER) { | 
 
| 10 |         System.out.println(tokenizer.nval); | 
 
| 12 |     } elseif(tokenizer.ttype == StreamTokenizer.TT_EOL) { | 
 
 
 
译者注:TT_EOF表示流末尾,TT_EOL表示行末尾。
StreamTokenizer可以识别标示符,数字,引用的字符串,和多种注释类型。你也可以指定何种字符解释成空格、注释的开始以及结束等。在StreamTokenizer开始解析之前,所有的功能都可以进行配置。请查阅官方文档获取更多信息。
PrintWriter
原文链接
与PrintStream类似,PrintWriter可以把格式化后的数据写入到底层writer中。由于内容相似,不再赘述。
值得一提的是,PrintWriter有更多种构造函数供使用者选择,除了可以输出到文件、Writer以外,还可以输出到OutputStream中(译者注:PrintStream只能把数据输出到文件和OutputStream)。
StringReader
原文链接
StringReader能够将原始字符串转换成Reader,代码如下:
| 01 | Reader reader = newStringReader("input string..."); | 
 
| 03 | intdata = reader.read(); | 
 
| 07 |     //do something with data... | 
 
| 09 |     doSomethingWithData(data); | 
 
 
 
StringWriter
原文链接
StringWriter能够以字符串的形式从Writer中获取写入到其中数据,代码如下:
| 1 | StringWriter writer = newStringWriter(); | 
 
| 3 | //write characters to writer. | 
 
| 5 | String data = writer.toString(); | 
 
| 7 | StringBuffer dataBuffer = writer.getBuffer(); | 
 
 
 
toString()方法能够获取StringWriter中的字符串数据。
getBuffer()方法能够获取StringWriter内部构造字符串时所使用的StringBuffer对象。
 
 
 
 
 
 
												
												
								- Java IO之字符流和文件
		前面的博文介绍了字节流,那字符流又是什么流?从字面意思上看,字节流是面向字节的流,字符流是针对unicode编码的字符流,字符的单位一般比字节大,字节可以处理任何数据类型,通常在处理文本文件内容时,字 ... 
- [Java IO]03_字符流
		Java程序中,一个字符等于两个字节. Reader 和 Writer 两个就是专门用于操作字符流的类. Writer Writer是一个字符流的抽象类.  它的定义如下: public abstra ... 
- Java IO编程——字符流与字节流
		在java.io包里面File类是唯一 一个与文件本身有关的程序处理类,但是File只能够操作文件本身而不能够操作文件的内容,或者说在实际的开发之中IO操作的核心意义在于:输入与输出操作.而对于程序而 ... 
- java IO之 字符流  (字符流 = 字节流 + 编码表) 装饰器模式
		字符流 计算机并不区分二进制文件与文本文件.所有的文件都是以二进制形式来存储的,因此, 从本质上说,所有的文件都是二进制文件.所以字符流是建立在字节流之上的,它能够提供字符 层次的编码和解码.列如,在 ... 
- Java——IO类 字符流概述
		body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ... 
- Java IO(四--字符流基本使用
		在上一节,介绍了字节流的基本使用,本节介绍一下字符流的使用 Reader: public abstract class Reader implements Readable, Closeable {  ... 
- Java IO系统--字符流
		字符流:尽管字节流提供了处理任何类型输入/输出操作的足够功能,它们补鞥呢直接操作Unicode字符.字符流层次结构的顶层是Reader和Writer抽象类.类似于InputStream和OutputS ... 
- Java IO之字符流
		public static void main(String[] args) { FileWriter fw = null; try { fw = new FileWriter("/User ... 
- java字节流和字符流,以及java文件操作
		A.首先说字节流:1.字节流在操作的时候不会用到缓冲区(也就是内存)2.字节流可用于任何类型的对象,包括二进制对象3.字节流处理单元为1个字节,操作字节和字节数组.InputStream是所有字节输入 ... 
随机推荐
	
									- sersync配置
			只记录了自己的操作步骤,详细信息也可以参考https://www.cnblogs.com/sellsa/p/5345092.html 安装sersync 将sersync安装包解压后会有两个配置文件  ... 
- 提高js性能的方法
			1.文档瘦身 (1)删除注释(版权及法律声明部分应保留),运行时不需要注释. (2)删除制表符.空格和换行符,这些只是为了便于程序的维护,但是与执行无关. (3)替换长的变量名为短的变量名. (4)使 ... 
- Halcon函数总结(一)
			Halcon函数总结: read_image( :Image :FileName : )  //读入图像 crop_part(Image : ImagePart :Row,Column,Width,H ... 
- C语言-再论指针与数组
			指针与数组的天生姻缘1.以指针方式来访问数组元素(1).数组元素使用时不能整体访问,只能是单个访问.访问形式有两种:数组形式和指针形式.(2).数组形式访问数组元素:数组名[下标]:(下标从0开始(3 ... 
- 18 11 05     继续补齐对python中的class不熟悉的地方     和  pygame 精灵
			---恢复内容开始--- class game : #历史最高分----- 是定义类的属性 top_score =0 def __init__(self, player_name) : #是定义的实例 ... 
- MVPR下的PHP分页教程
			这个PHP分页其实不难,现在就开始看看核心思路吧. 我习惯从最底层开始看起. 1. 首先用LIMIT偏移QUERY的指针 /* * get hot post by current page * @pa ... 
- 微信oauth2授权获得用户信息
			<?php session_start(); header("Content-type: text/html; charset=utf-8"); $home = 'index ... 
- Ubuntu---不能打开 exfat 文件系统格式的 U盘解决方法
			出现问题:今天把 U 盘插入 Ubuntu 系统的电脑中,打开 U 盘发现弹出 系统格式不支持 的提醒,无法进入 U 盘进行操作. 环境: Ubuntu18.04 TSL; 格式化为 exfat 文件 ... 
- Android巩固之事件分发机制
			https://www.cnblogs.com/liaojie970/p/5869152.html onTouchEvent是真正用来进行业务逻辑处理的地方,返回true表示已经将该事件消费,返回fa ... 
- 第2章 Innodb 存储引擎
			一.InnoDB 体系架构 1.1后台线程 master thread:刷新内存中的数据到磁盘 io thread:处理 IO 请求,AIO purge thread:清理undo 页的回收 page ...