面向字符的输入输出流

本文最后更新于:2024年3月18日 凌晨

面向字符的输入输出流

面向字符的输入流

  • 面向字符的输入流都是类Reader 的后代,如下图所示:

  • Reader类是一个抽象类,提供的方法与InputStream类似,只是将基于byte的参数改为基于char,下面列出了几个常用的方法。

    • public int read():从流中读一个字符,返回字符的整数编码,如果读至流的末尾,则返回-1
    • public int read(char[] b,int off,int len):从流中读一个字符,返回字符的整数编码,如果读至流的末尾,则返回-1
    • public int read(char[] b):等价于read(buf,0,buf.length)形式。
    • public long skip(long n):指针跳过n个字符,定位输入位置指针的方法。
  • 类Reader的常见子类及功能描述如下表所示:

类名 构造方法的参数 功能描述
CharArrayReader 字符数组char[ ] 用于对字符数据中的数据进行转换
BufferedReader 类Reader的对象 为输入提供缓冲的功能,提高效率
LineNumberReader 类Reader的对象 为输入数据附加行号
InputStreamReader InputStream的对象 将面向字节的输入流转换为字符输入流
FileReader File对象或字符串表示的文件名 文件作为输入源
PipedReader PipedWrite的对象 与另一输出管道相连,读取另一管道写入的字符
StringReader 字符串 以字符串作为输入源,用于对字符串中的数据进行转换

[例13-5]:从一个文本文件中读取数据加上行号后显示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class 从一个文本文件中读取数据加上行号后显示 {
public static void main(String[] args) {
try {
FileReader file = new FileReader("src/Study/流式输入输出与文件处理/面向字符的输入输出流/面向字符的输入流/test");
LineNumberReader in = new LineNumberReader(file);
boolean eof = false;
while (!eof){
// 利用LineNumberReader的readLine()方法从文件文件中逐行读取数据。
String x = in.readLine();// 从输入流读一行文本。
if (x==null)// 是否读至文件尾。
eof=true;
else
// 通过getLineNumber()方法得到行号与该行文本拼接后输出,显示结果是给每行加上了行号。
System.out.println(in.getLineNumber()+":"+x);
}
in.close();
}catch (IOException e){}
}
}
  • 注意:readLine()方法在遇到文件末尾时将返回null

面向字符的输出流

面向字符的输出流类都是类Writer的后代,如下图所示:

  • Writer类是一个抽象类,提供的方法与OutputStream类似,只是将基于byte的参数改为基于char,下面列出了常用的几个方法:

    • public void write(int c):往字符输入流写入一个字符,它是将整数的低16位对应的数据写入流中,高16位将忽略。
    • public void write(char[] cbuf):将一个字符数组写入到流中。
    • public void write(String str):将一个字符串写到流中。
  • Write类的常见子类的简要介绍如下表所示:

类名 构造方法的主要参数 功能描述
CharArrayWriter 字符数组char[ ] 用于对字符数组中的数据进行转换
BufferedWriter 类Writer的对象 为输出提供缓冲功能,提高效率
OutputStreamWriter OutputStream的对象 将面向字节的输出流转换为字符输出流
FileWriter 文件对象或字符串表示的文件名 文件作为输出源
PipedWriter PipedReader的对象 与另一输出管道相连,写入数据给另一管道供其读取
StringWriter 字符串 以程序中的一字符串作为输出源,用于对字符数组中的数据进行转换
FilterWriter Writer的对象 装饰另一输出流以提供附加的功能
PrinterWriter Writer的对象或OutputStream的对象 为所装饰的输出流提供打印输出,与类PrintStream只有细微差别
  • 以下结合实例介绍FileWriter类的使用,该类的直接父类是OutputStreamWriter,后者又继承Writer类,FileWriter的常用构造方法如下。
    • FileWriter(String fileName):根据文件名构造一个FileWriter对象。
    • FileWriter(String fileName,boolean append):第一个参数为文件名,第二个参数用于指示是否可以往文件中添加数据。

[例13-6]:用FileWriter流将ASCII英文字符集字符写入到文件。

1
2
3
4
5
6
7
8
9
10
11
12
public classFileWriter流将ASCII英文字符集字符写入到文件 {
public static void main(String[] args) {
try{
FileWriter fw = new FileWriter("src/Study/流式输入输出与文件处理/面向字符的输入输出流/面向字符的输出流/charset.txt");
for (int i=32;i<126;i++)
fw.write(i);
fw.close();
}catch (IOException e){}
}
}

!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}
  • 说明:FileWriter类的构造方法,write()方法及close()方法可能产生IO异常,必须进行异常捕获处理,执行FileWriter的构造方法时,如果文件不存在,将自动创建文件。
  • 注意:前面介绍的Writer类的3个方法均可实现汉字的写入,例如:
1
2
3
4
char x[]={'高','兴'};
fw.write('好');
fw.write(x);
fw.write("\nhello 你好");