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()方法从文件逐行读取,末尾返回null
if (x == null) //是否读至文件尾
eof = true;
else
System.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 面向字符的输出流
![image.png](https://cdn.nlark.com/yuque/0/2022/png/26772170/1651067919675-f02ac5ad-d08f-4ede-a520-2865b368a48c.png#clientId=ue664924c-c297-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=368&id=u49f64497&margin=%5Bobject%20Object%5D&name=image.png&originHeight=561&originWidth=832&originalType=binary&ratio=1&rotation=0&showTitle=false&size=23958&status=done&style=none&taskId=u4fb2eaee-5eae-450a-a7a3-5406bc2fcf7&title=&width=546)
<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;
else
out.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。