转载自   Java IO: 其他字符流(下)

作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com)

本小节会简要概括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

原文链接

与PrintStream类似,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对象。

Java IO: 其他字符流(下)相关推荐

  1. java io 字节流 字符流

    1.流的概念 在程序中,所有的数据都是以流的形式进行传输和保存的,当程序需要数据的时候要使用输入流读取数据,而当程序需要保存数据时要使用输出流写数据 2.字节流和字符流 字节流:处理单元为1个字节,操 ...

  2. java IO(输入输出) 字符流

    //读取文件中的字符 package zhi_jie_liu;import java.io.*;public class Example08 {public static void main(Stri ...

  3. 【java笔记】字符流,Properties,序列化,打印流

    字符流 字符流=字节流+编码 package demo04;import java.io.FileInputStream; import java.io.FileNotFoundException; ...

  4. Java笔记整理六(File类,递归,字节流IO,字符流IO,流中的异常处理,属性集Properties,缓冲流,转换流,序列化,打印流)

    1.File类 java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和删除等操作. 文件和目录路径名的抽象表示 java把文件和文件夹封装位为一个File类,我们可 ...

  5. Java字节流和字符流,是时候总结一下IO流了

    Java字节流和字符流,是时候总结一下IO流了 从接收输入值说起 字节流读取 字符流读取 Scanner 读取 什么是 IO 流 字节流和字符流 字节流 字节输入流 字节输出流 缓冲流的原理 字符流 ...

  6. 复习Java字节流_字符流使用及案例

    字节流_字符流 主要内容 IO流 字节流 字符流 异常处理 Properties 第一章 IO概述 1.1 什么是IO 生活中,你肯定经历过这样的场景.当你编辑一个文本文件,忘记了ctrl+s ,可能 ...

  7. java字符流实际上也是字节,[Java教程]Java字节流与字符流的区别

    [Java教程]Java字节流与字符流的区别 0 2017-05-22 12:00:42 字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢? 实际上字节流在操作时本身 ...

  8. java:字节流、字符流

    主要内容* IO流* 字节流* 字符流* 异常处理* Properties 第一章 IO概述1.1 什么是IO 生活中,你肯定经历过这样的场景.当你编辑一个文本文件,忘记了`ctrl+s` ,可能文件 ...

  9. Java——IO(打印流)

    1,打印字节流(PrintStream)的概述: 打印流可以很方便的将对象的toString()结果输出并且自动加上换行,而且可以使用自动刷出的模式 System.out就是一个PrintStream ...

最新文章

  1. python 爬虫ip代理
  2. 详解OS X和iOS图像处理框架Core Image
  3. aarch64的TCR寄存器介绍
  4. android虚拟机的垃圾收集
  5. 【学习笔记】Tableau安装与界面介绍
  6. 使用Hibernate生成数据库和连接数据库
  7. 如何根据原理图画封装_常用原理图封装
  8. 什么样的程序员是最让人讨厌的?朋友们注意了,别做这种人!
  9. Visual Studio统计有效代码行数
  10. JDBC实现学生信息管理系统(仅增删改查)
  11. 应用vb编程_VB编程中的列表框综合应用讲解
  12. 基于浏览器父子窗口值传递
  13. DW Basic Knowledge1
  14. linux端口占满,Linux查看端口占用情况,并强制释放占用的端口
  15. “凸现”三围的健身运动法(图)
  16. 关于增量模型和迭代模型的区别
  17. APS54083 DC/DC升降压恒流驱动芯片 2.4G调光 —提供DEMO板
  18. 锐速ServerCheck序列号生成原理
  19. Python定义常量,设置config.py文件
  20. 关于编程学习的心态与方法

热门文章

  1. fc协议有哪些数据传输服务器,FC协议详解
  2. 在安装keepalived出现问题:需要:libmysqlclient.so.18
  3. [数据结构-严蔚敏版]P61ADT Queue的表示与实现(单链队列-队列的链式存储结构)
  4. [C++11]独占的智能指针unique_ptr的初始化和使用
  5. 2019年第十届蓝桥杯国赛B组试题A-平方序列-枚举
  6. python正态分布函数_python3-正态分布
  7. SQL(七) - 事务、索引、视图
  8. 2k 幻14_幻14、2020雷蛇潜行版、mbp、gs66等笔记本之间的选择??
  9. 2021HDU多校第五场1004 Another String-双指针
  10. CF840D. Destiny