目录:系统学习 Java IO---- 目录,概览

跟踪行号的缓冲字符输入流 LineNumberReader

LineNumberReader 类是一个 BufferedReader ,用于跟踪读取字符的行号。行号从 0 开始。每当 LineNumberReader 在包装的 Reader 返回的字符中遇到行终止符时,行号递增。

可以通过调用 getLineNumber() 方法获取当前行号,也可以通过调用 setLineNumber() 方法设置当前行号。

注意设置的行号不会改变实际的文件指针,仅仅是改变了内部的一个 lineNumber 变量,这样getLineNumber() 方法获取的也是 lineNumber 变量的值,不要妄想通过这个 setLineNumber() 方法随机访问文本行。

一个示例如下:

public class LineNumberReaderExample {
public static void main(String[] args) throws IOException {
/*文件内容是:
first line
second line
third line
*/
LineNumberReader reader = new LineNumberReader(new FileReader("D:\\test\\input.txt"));
System.out.println("line= " + reader.getLineNumber() + ", context= " + reader.readLine());
reader.setLineNumber(666); // 这个方法只是指示了当前行号,并不会改读取结果
System.out.println("line= " + reader.getLineNumber() + ", context= " + reader.readLine());
}
}

输出的结果是:

line= 0, context= first line
line= 666, context= second line

如果要解析可能包含错误的文本文件,则此类很方便。 向用户报告错误时,如果指出错误在第几行,则更容易纠正错误。

完成从 LineNumberReader 读取字符时,记得关闭它,LineNumberReader 还将关闭 LineNumberReader 正在读取的 Reader 实例。调用 close() 方法可以关闭 LineNumberReader 。

标记字符输入流 StreamTokenizer

StreamTokenizer 类可以将从 Reader 读取的字符做标记。 例如,在字符串“I love money...”中,每个单词都是一个单独的标记。

在解析文件或计算机语言时,在进一步处理它们之前将输入分解为标记是正常的。 此过程也称为“词法(lexing)”或“ 符号化(tokenizing)”。

使用 StreamTokenizer 类,可以浏览基础 Reader 中的标记。 通过在循环内调用 StreamTokenizer 的 nextToken() 方法来实现此目的。 每次调用 nextToken() 之后,StreamTokenizer 都有几个字段,可以阅读这些字段以查看读取的令牌类型和值等。这些字段是:

ttype token type ,读取的令牌类型(字,数字,行尾)

sval string val ,令牌的字符串值,如果令牌是字符串(word)

nval number val ,令牌的数字值,如果令牌是数字。

这是一个简单的 StreamTokenizer 示例:

StreamTokenizer streamTokenizer = new StreamTokenizer(new StringReader("I had 1 little cat.."));
while (streamTokenizer.nextToken() != StreamTokenizer.TT_EOF) {
switch (streamTokenizer.ttype) {
case StreamTokenizer.TT_WORD:
System.out.println(streamTokenizer.sval);
break;
case StreamTokenizer.TT_NUMBER:
System.out.println((int) streamTokenizer.nval);
break;
case StreamTokenizer.TT_EOL: // end of the line
System.out.println();
}
}

StreamTokenizer 能够识别标识符,数字,带引号的字符串和各种注释样式。 还可以指定要将哪些字符解释为空格,注释开始,结束等。在开始解析其内容之前,所有这些都在 StreamTokenizer 上配置。 有关更多信息,请参阅 JavaDoc。

当从 StreamTokenizer 读完令牌后,记得关闭它。 关闭 StreamTokenizer 还将关闭 StreamTokenizer 正在读取的 Reader 实例。

打印字符流 PrintWriter

PrintWriter 类可以将格式化数据写入基础 Writer 。 例如,将 int,long 和其他基本类型数据写为格式化为文本,而不是作为其字节值。

如果要生成必须混合文本和数字的报表(或类似报表),PrintWriter 非常有用。 除了写入原始字节的方法之外,PrintWriter 类具有与 PrintStream 相同的所有方法。 作为 Writer 子类,PrintWriter 旨在编写文本。

一个示例如下:

public class PrintWriterExample {
public static void main(String[] args) throws IOException {
PrintWriter printWriter = new PrintWriter(new FileWriter("D:\\test\\input.txt")); printWriter.print(true);
printWriter.print((int) 123);
printWriter.print((float) 123.456);
printWriter.printf("Text + data: %d", 123); printWriter.close();
}
}

最后 input.txt 文件内容是“true123123.456Text + data: 123"

构造器

PrintWriter 具有多种结构选择器,可以将其连接到 File,OutputStream 或 Writer 。 以这种方式,PrintWriter 与其他 Writer 子类有点不同,后者往往需要将其他 Writer实例作为参数的构造函数(除了少数,如 OutputStreamWriter )。

方法 描述
PrintWriter(File file, String csn) 创建具有指定文件和字符集且不带自动刷行新的新 PrintWriter。
PrintWriter(OutputStream out, boolean autoFlush) 通过现有的 OutputStream 创建新的可指定自动刷新的 PrintWriter。
PrintWriter(String fileName, String csn) 创建具有指定文件名称和字符集且不带自动行刷新的新 PrintWriter。
PrintWriter(Writer out, boolean autoFlush) 创建新的可指定自动刷新的 PrintWriter。

此外,PrintWriter 有 重载的 append()方法,print() 方法,printf()/format()方法,println()方法和 writer()方法。

close()

完成将字符写入 PrintWriter 后,记得关闭它。 关闭 PrintWriter 还将关闭 PrintWriter 正在写入的 Writer 实例。

字符串读写 StringReader/StringWriter

StringReader 类可以将普通的 String 转换为 Reader 。

StringWriter 类能够以 String 形式将字符写入 Writer 。

写入 StringWriter 的字符可以通过两个方法 toString() 和 getBuffer() 获得,两个方法返回的内容一致。

区别在于方法 toString() 返回 String 类型。方法 getBuffer() 返回 StringBuffer 类型。

一个简单的示例如下:

public class StringRW {
public static void main(String[] args) throws IOException {
StringWriter stringWriter = new StringWriter();
stringWriter.write('H');
stringWriter.append('e');
stringWriter.write("llo");
stringWriter.write("World".toCharArray()); String data = stringWriter.toString(); // HelloWorld
StringBuffer dataBuffer = stringWriter.getBuffer();
System.out.println(data.equals(dataBuffer.toString())); // true
stringWriter.close(); StringReader stringReader = new StringReader(data);
int d = stringReader.read();
while (d != -1) {
System.out.print((char) d); // HelloWorld
d = stringReader.read();
}
stringReader.close();
}
}

系统学习 Java IO (十五)----字符读写 Reader/Writer 其他子类的更多相关文章

  1. 系统学习 Java IO (十四)----字符读写缓存和回退 BufferedReader/BufferedWriter & PushbackReader

    目录:系统学习 Java IO---- 目录,概览 BufferedReader BufferedReader 类构造器接收一个 Reader 对象,为 Reader 实例提供缓冲. 缓冲可以加快 I ...

  2. 系统学习 Java IO (十六)----这么多类,应该用哪个?

    目录:系统学习 Java IO---- 目录,概览 Java IO目的和功能 Java IO 包含 InputStream,OutputStream,Reader 和 Writer 类的许多子类. 原 ...

  3. 系统学习 Java IO (四)----文件的读写和随机访问 FileInputStream/FileOutputStream & RandomAccessFile

    目录:系统学习 Java IO---- 目录,概览 文件输入流 FileInputStream 这是一个简单的FileInputStream示例: InputStream input = new Fi ...

  4. 系统学习 Java IO (十二)----数据流和对象流

    目录:系统学习 Java IO---- 目录,概览 DataInputStream/DataOutputStream 允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型. 要想使用 ...

  5. 系统学习 Java IO (十)----回退流 PushbackInputStream

    目录:系统学习 Java IO---- 目录,概览 PushbackInputStream 旨在从 InputStream 解析数据时使用. 有时您需要先读取几个字节以查看将要发生的事情,然后才能确定 ...

  6. 系统学习 Java IO ---- 目录,概览

    Java IO 类的系统教程,原创.主要参考自英文教程 Java IO Tutorial 和 Java Doc. http://tutorials.jenkov.com/java-io/index.h ...

  7. 系统学习 Java IO (一)----输入流和输出流 InputStream/OutputStream

    目录:系统学习 Java IO ---- 目录,概览 InputStream 是Java IO API中所有输入流的父类. 表示有序的字节流,换句话说,可以将 InputStream 中的数据作为有序 ...

  8. 系统学习 Java IO (十三)----字符读写 Reader/Writer 及其常用子类

    目录:系统学习 Java IO---- 目录,概览 Reader Reader 类是 Java IO API 中所有 Reader 子类的基类. Reader 类似于 InputStream ,除了它 ...

  9. 系统学习 Java IO (五)----使用 SequenceInputStream 组合多个流

    目录:系统学习 Java IO---- 目录,概览 SequenceInputStream 可以将两个或多个其他 InputStream 合并为一个. 首先,SequenceInputStream 将 ...

随机推荐

  1. 一张图弄明白开源协议-GPL、BSD、MIT、Mozilla、Apache和LGPL 之间的区别

    导读 在开源软件中经常看到各种协议说明,GPL.BSD.MIT.Mozilla.Apache和LGPL. - 这些协议之间的有什么区别 - 如何选择合适的开源协议 请看下文,特作记录一篇,以供后续查看 ...

  2. Chart.js报告

    引进需要Chart.js <%@ page language="java" pageEncoding="UTF-8"%> <!DOCTYPE ...

  3. hdoj 5087 Revenge of LIS II 【第二长单调递增子】

    称号:hdoj 5087 Revenge of LIS II 题意:非常easy,给你一个序列,让你求第二长单调递增子序列. 分析:事实上非常easy.不知道比赛的时候为什么那么多了判掉了. 我们用O ...

  4. Effective JavaScript Item 38 调用父类的构造函数在子类的构造函数

    作为这一系列Effective JavaScript的读书笔记. 在一个游戏或者图形模拟的应用中.都会有场景(Scene)这一概念.在一个场景中会包括一个对象集合,这些对象被称为角色(Actor). ...

  5. GTK+浅谈之一Windows10下QtCreator中GTK+环境搭建(十几篇)

    一.简介 虽然GTK+是Linux下的开发环境,因为其跨平台特性,有时候需要在Windows上用到它的.如下是在Windows10下配置GTK+的开发环境.        Gnome的开发基础结构是围 ...

  6. TCP网络通讯如何解决分包粘包问题(有模拟代码)

    TCP作为常用的网络传输协议,数据流解析是网络应用开发人员永远绕不开的一个问题. TCP数据传输是以无边界的数据流传输形式,所谓无边界是指数据发送端发送的字节数,在数据接收端接受时并不一定等于发送的字 ...

  7. CSharp获取图形文件的读写

    C#是微软发布了一个面向对象.开展对.NET Framework上述高级编程语言.并定于占领在微软开发者论坛(PDC)在首演. C#这是微软研究员Anders Hejlsberg最新成就.C#容貌Ja ...

  8. 疯狂的图形(利用C# + GDI plus模拟杂乱无章的现实场景)

    原文:疯狂的图形(利用C# + GDI plus模拟杂乱无章的现实场景) 本文给出了模拟竹叶.长叶草.杂乱石头.天上繁星等关键代码.使用.Net环境下C#语言,GDI+编写.   模拟竹叶 挺像的吧? ...

  9. node express4.x 的安装

    4.x开始不再是 一个express就搞定一切了,需要装另外一个部署插件 具体: 跟着<nodejs开发指南>敲npm install -g express, 安装好了,就在linux命令 ...

  10. CefSharp For WPF响应页面点击事件

    初始化 <!--浏览器--> <cefSharpWPF:ChromiumWebBrowser Name="webBrowser" Grid.Row="0 ...