13.3.1 面向字符的输入流
类Reader的主要子类及说明
| 类名 | 构造方法的主要参数 | 功能描述 |
|---|---|---|
| CharArrayReader | 字符数组char[] | 用于对字符数组中的数据进行转换 |
| BufferedReader | 类Reader的对象 | 为输入提供缓冲的功能,提高效率 |
| LineNumberReader | 类Reader的对象 | 为输入数据附加行号 |
| InputStreamReader | InputStream的对象 | 将面向字节的输入流转换为字符输入流 |
| FileReader | 文件对象或字符串表示的文件名 | 文件作为输入源 |
| PipedReader | PipedWriter的对象 | 与另一输出管道相连,读取另一管道写入的字符 |
| StringReader | 字符串 | 以程序中的一字符串作为输入源,通常用于对字符串中的数据进行转换 |
类Reader的方法
public int read():从流中读一个字符,返回字符的整数编码,如果读至流的末尾,则返回-1public int read(char[] buf, int off, int len):从输入流读指定长度的数据到字符数组,数据从字节数组的off处开始存放,如果输入流无数据可读则返回-1public int read(char[] buf): 等价于read(buf,0,buf.length)形式public long skip(long n):指针跳过n个字节LineNumberReader类的使用
```java 从一个文本文件中读取数据加上行号后显示 import java.io.*; public class AddLineNo { public static void main(String[] args) {
}try{FileReader file= new FileReader("AddLineNo.java");LineNumberReader in=new LineNumberReader(file);boolean eof = false;while (!eof){String x= in.readLine(); 利用LineNumberReader的readLine()方法从文件逐行读取,末尾返回nullif (x == null) //是否读至文件尾eof = true;elseSystem.out.println(in.getLineNumber()+":"+x); 利用getLineNumber()方法得到行号与文本拼接后输出}in.close();} catch (IOException e) { };
例 在屏幕上显示文件内容 (单个字符读)
import java.io.*;
public class test13_4 {
public static void main(String args[]) {
try {
FileReader infile = new FileReader(args[0]); 以字符为单位访问
//FileReader infile = new FileReader(“test13_4.java”);
int charRead = infile.read();
while (charRead != -1) {System.out.print((char) charRead);//System.out.printf("%c", charRead);charRead = infile.read();}}catch(ArrayIndexOutOfBoundsException e){System.out.println("需要提供一个文件名作为命令行参数 ");}catch(FileNotFoundException e){System.out.println("file not find! ");}catch(IOException e){};}
}
在屏幕上显示文件内容(行读)
import java.io.*;
public class DisplayFile
{
public static void main(String args[])
{
try {
BufferedReader infile = new BufferedReader(new FileReader(args[0]));
//BufferedReader infile = new BufferedReader(new FileReader(“test13_4.java”));
String x = infile.readLine();
while (x != null) {
System.out.println(x);
//System.out.printf(“%s\n”, x);
x = infile.readLine();
}
}catch(ArrayIndexOutOfBoundsException e) {
System.out.println(“需要提供一个文件名作为命令行参数 “);
}catch(FileNotFoundException e) {
System.out.println(“file not find! “);
}catch(IOException e){};
}
}
<a name="WyUZk"></a>## 13.3.2 面向字符的输出流<a name="dOtux"></a>### 类Writer的主要子类及说明| 类名 | 构造方法的主要参数 | 功能描述 || --- | --- | --- || CharArrayWriter | 字符数组char[] | 用于对字符数组中的数据进行转换 || BufferedWriter | 类Writer的对象 | 为输出提供缓冲的功能,提高效率 || OutputStreamWriter | OutputStream的对象 | 将面向字节的输出流转换为字符输出流 || FileWriter | 文件对象或字符串表示的文件名 | 文件作为输出源 || PipedWriter | **PipedReader的对象 ** | **与另一输出管道相连,写入数据给另一管道供其读取 ** || StringWriter | **字符串 ** | **以程序中的一字符串作为输出源,用于对字符数组中的数据进行转换 ** || FilterWriter | **Writer的对象 ** | **装饰另一输出流以提供附加的功能 ** || PrinterWriter | **Writer的对象或OutputStream的对象 ** | **为所装饰的输出流提供打印输出,与类PrintStream只有细微差别。 ** |类Writer提供的方法与OutputStream类似,只是将基于byte的参数改为基于char。 <br />几种常用形态如下。- `public void **write(int c)** ` 往文件写入一个字符,它是将整数的低16位对应的数据写入文件,高16位将忽略。- `public void **write(char[] cbuf)**` 将一个字符数组写入文件- `public void **write(String str)**` 将一个字符串写入文件**以上方法均可处理汉字字符写入。**```java用FileWriter流将ASCII英文字符集字符写入到文件import java.io.*;public class CharWrite{public static void main(String args[]){try{FileWriter fw=new FileWriter("charset.txt ");for(int i=32;i<126;i++)fw.write(i);fw.close();} catch (IOException e) { }}}运行结果:(乱码)!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}【说明】FileWriter类的构造方法、write()以及close()方法可能产生IO异常,必须进行异常捕获,文件不存在自动创建【注意】Writer类的3个方法均可实现汉字写入1、char[] x={'高','高','兴','兴'};fw.write(x);//输出:高高兴兴2、fw.write("hello你好");//输出:hello你好【拓展】要想输出整形数据,将fw.write(i);——————>fw.write(Integer.toString(i));整型数字转换为字符串改编例13-5,将指定文件的内容加行号写入另一个文件。import java.io.*;public class AddLineNo{public static void main(String[] args){try{FileReader file= new FileReader("AddLineNo.java");FileWriter out=new FileWriter("target.txt");LineNumberReader in=new LineNumberReader(file);while (true){String x= in.readLine();if (x == null)break;elseout.write(in.getLineNumber()+":"+x+"\r\n");}out.close();} catch (IOException e) {};}}
思考题
给指定的Java源程序所有行加上行号,行号和程序之间间隔2个空格。处理结果写入到另一个文件(target.txt)中。
- Java源程序的文件名由命令行参数指定。
- 行号占用位数由命令行参数确定(2或3)。
- 如果2位,则一位数的行号前面补0。
- 如果为3位,则1位数补2个0,2位数补1个0。
