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

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

PushbackReader

原文链接

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

1 PushbackReader reader = new PushbackReader(new FileReader("c:\\data\\input.txt"));
2  
3 int data = reader.read();
4  
5 reader.unread(data);

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

1 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()实现流的跳跃读取)。代码如下:

01 LineNumberReader reader = new LineNumberReader(new FileReader("c:\\data\\input.txt"));
02  
03 int data = reader.read();
04  
05 while(data != -1){
06  
07     char dataChar = (char) data;
08  
09     data = reader.read();
10  
11     int lineNumber = reader.getLineNumber();
12  
13 }

如果解析的文本有错误,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 = new StreamTokenizer(new StringReader("Mary had 1 little lamb..."));
02  
03 while(tokenizer.nextToken() != StreamTokenizer.TT_EOF){
04  
05     if(tokenizer.ttype == StreamTokenizer.TT_WORD) {
06  
07         System.out.println(tokenizer.sval);
08     else if(tokenizer.ttype == StreamTokenizer.TT_NUMBER) {
09  
10         System.out.println(tokenizer.nval);
11  
12     else if(tokenizer.ttype == StreamTokenizer.TT_EOL) {
13  
14         System.out.println();
15  
16     }
17  
18 }

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

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

PrintWriter

原文链接

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

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

StringReader

原文链接

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

01 Reader reader = new StringReader("input string...");
02  
03 int data = reader.read();
04  
05 while(data != -1) {
06  
07     //do something with data...
08  
09     doSomethingWithData(data);
10  
11     data = reader.read();
12  
13 }
14  
15 reader.close();

StringWriter

原文链接

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

1 StringWriter writer = new StringWriter();
2  
3 //write characters to writer.
4  
5 String data = writer.toString();
6  
7 StringBuffer dataBuffer = writer.getBuffer();

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

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

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Java IO: 其他字符流(下)

Java IO: 其他字符流(下)的更多相关文章

  1. Java IO之字符流和文件

    前面的博文介绍了字节流,那字符流又是什么流?从字面意思上看,字节流是面向字节的流,字符流是针对unicode编码的字符流,字符的单位一般比字节大,字节可以处理任何数据类型,通常在处理文本文件内容时,字 ...

  2. [Java IO]03_字符流

    Java程序中,一个字符等于两个字节. Reader 和 Writer 两个就是专门用于操作字符流的类. Writer Writer是一个字符流的抽象类.  它的定义如下: public abstra ...

  3. Java IO编程——字符流与字节流

    在java.io包里面File类是唯一 一个与文件本身有关的程序处理类,但是File只能够操作文件本身而不能够操作文件的内容,或者说在实际的开发之中IO操作的核心意义在于:输入与输出操作.而对于程序而 ...

  4. java IO之 字符流 (字符流 = 字节流 + 编码表) 装饰器模式

    字符流 计算机并不区分二进制文件与文本文件.所有的文件都是以二进制形式来存储的,因此, 从本质上说,所有的文件都是二进制文件.所以字符流是建立在字节流之上的,它能够提供字符 层次的编码和解码.列如,在 ...

  5. Java——IO类 字符流概述

    body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...

  6. Java IO(四--字符流基本使用

    在上一节,介绍了字节流的基本使用,本节介绍一下字符流的使用 Reader: public abstract class Reader implements Readable, Closeable { ...

  7. Java IO系统--字符流

    字符流:尽管字节流提供了处理任何类型输入/输出操作的足够功能,它们补鞥呢直接操作Unicode字符.字符流层次结构的顶层是Reader和Writer抽象类.类似于InputStream和OutputS ...

  8. Java IO之字符流

    public static void main(String[] args) { FileWriter fw = null; try { fw = new FileWriter("/User ...

  9. java字节流和字符流,以及java文件操作

    A.首先说字节流:1.字节流在操作的时候不会用到缓冲区(也就是内存)2.字节流可用于任何类型的对象,包括二进制对象3.字节流处理单元为1个字节,操作字节和字节数组.InputStream是所有字节输入 ...

随机推荐

  1. github 新建库,提交命令

    Command line instructions You can also upload existing files from your computer using the instructio ...

  2. 黑马IDEA版javaweb_2-1基础加强

    今日内容 1. Junit单元测试 2. 反射 3. 注解 ## Junit单元测试: * 测试分类: 1. 黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值. 2. 白盒测试:需要写代码 ...

  3. java8的lambda过滤list遍历集合,排序

    1.根据属性过滤list List<AllManagerBean> testLists = broadCastRoomMapper.allManagerlist(); List<Al ...

  4. drf框架知识点总复习

    接口 """ 1.什么是接口:url+请求参数+响应数据 | 接口文档 2.接口规范: url:https,api,资源(名词复数), v1,get|post表示操作资源 ...

  5. ant design for vue 解决 vue.esm.js?c5de:628 [Vue warn]: Invalid prop: custom validator check failed for prop "defaultValue". 的错误

    错误重现: 在使用ant design for vue 的选择器插件的时候, 设置默认为为id(为数字) 报错: 解决办法: id为数字, 而defaultValue 的key 值必须为字符串, 将i ...

  6. MySQL去除表里数据回车符,换行符,空格和水平制表符

    MySQL去除表里数据回车符,换行符,空格和水平制表符 最近导数据的时候发现表里有好多回车符,换行符,水平制表符,MySQL的trim函数没办法去掉回车和换行,只能去掉多余的空格,可以用MySQL的r ...

  7. 基于JSP开发医院预约挂号系统 Java源码

    开发环境: Windows操作系统 开发工具: Eclipse+Jdk+Tomcat+MYSQL数据库 运行效果图: 源码及原文链接:http://javadao.xyz/forum.php?mod= ...

  8. 吴裕雄--天生自然 pythonTensorFlow图形数据处理:图像预处理完整样例

    import numpy as np import tensorflow as tf import matplotlib.pyplot as plt #随机调整图片的色彩,定义两种顺序. def di ...

  9. java 中的小数点、大数、随机数处理

    1.小数点处理 public class Test { public static void main(String[] args) { double i = 3.856; // 舍掉小数取整 Sys ...

  10. 基于邻接表的长度为k的简单路径的求解

    描述 一个连通图采用邻接表作为存储结构.设计一个算法,判断无向图中任意给定的两点是否存在一条长度为k的简单路径. 输入 多组数据,每组m+3数据行.第一行有两个数字n,m和k,代表有n个顶点,m条边和 ...