字符流

字符流

当使用字节流读取文本文件时,可能会有一个小问题。

就是遇到中文字符时,可能不会显示完整的字符,那是因为==一个中文字符可能占用多个字节存储==。

所以Java提供一些字符流类,以字符为单位读写数据,专门用于处理文本文件。

字符输入流

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import com.sun.org.apache.xpath.internal.operations.String;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
/**
* java.io.Reader 抽象类是表示用于读取字符流的所有类的超类,可以读取字符信息到内存中。它定义了字符输入流的基本共性功能方法。
* public void close() :关闭此流并释放与此流相关联的任何系统资源。
* public int read() : 从输入流读取一个字符。(读取单个字符并返回)
* public int read(char[]  cbuf) : 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中 。(一次读取多个字符,将字符读入数组)
*
* read 方法,每次可以读取一个字符的数据,提升为int类型,读取到文件末尾,返回 -1 ,循环读取
*/

/**
* FileReader类
* java.io.FileReader 类是读取字符文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。
*
* Java.io.FileReader extends InputStreamReader extends Reader
*
* 构造方法:
* FileReader(File file) : 创建一个新的 FileReader ,给定要读取的File对象。
* FileReader(String fileName) : 创建一个新的 FileReader ,给定要读取的文件的名称。
* 当你创建一个流对象时,必须传入一个文件路径。类似于FileInputStream
*
* 注意:
* 1. 字符编码:字节与字符的对应规则。Windows系统的中文编码默认是GBK编码表。
* idea中UTF-8
* 2. 字节缓冲区:一个字节数组,用来临时存储字节数据。
*/
public class ReaderExer {
public static void main(String[] args) throws IOException {
//读取字符
exer01();
//使用字符数组读取数据
exer02();
}

/**
* 读取字符
* @throws IOException
*/
private static void exer01() throws IOException {
//创建字符输入流对象
FileReader filereader = new FileReader(new File("a.txt"));
//定义变量保存数据
int b;
//读取字符
while((b = filereader.read()) != -1){
System.out.print((char) b);
}
//关闭资源
filereader.close();
}

private static void exer02() throws IOException {
//创建字符输入流对象
FileReader filereader = new FileReader(new File("a.txt"));
//创建数组
char[] buff = new char[2];
//读取数据
int i;
while((i = filereader.read(buff)) != -1){
System.out.print(buff);
}
//关闭流
filereader.close();
}
}

字符输出流

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import com.sun.org.apache.xpath.internal.operations.String;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
/**
* java.io.Reader 抽象类是表示用于读取字符流的所有类的超类,可以读取字符信息到内存中。它定义了字符输入流的基本共性功能方法。
* public void close() :关闭此流并释放与此流相关联的任何系统资源。
* public int read() : 从输入流读取一个字符。(读取单个字符并返回)
* public int read(char[]  cbuf) : 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中 。(一次读取多个字符,将字符读入数组)
*
* read 方法,每次可以读取一个字符的数据,提升为int类型,读取到文件末尾,返回 -1 ,循环读取
*/

/**
* FileReader类
* java.io.FileReader 类是读取字符文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。
*
* Java.io.FileReader extends InputStreamReader extends Reader
*
* 构造方法:
* FileReader(File file) : 创建一个新的 FileReader ,给定要读取的File对象。
* FileReader(String fileName) : 创建一个新的 FileReader ,给定要读取的文件的名称。
* 当你创建一个流对象时,必须传入一个文件路径。类似于FileInputStream
*
* 注意:
* 1. 字符编码:字节与字符的对应规则。Windows系统的中文编码默认是GBK编码表。
* idea中UTF-8
* 2. 字节缓冲区:一个字节数组,用来临时存储字节数据。
*/
public class ReaderExer {
public static void main(String[] args) throws IOException {
//读取字符
exer01();
//使用字符数组读取数据
exer02();
}

/**
* 读取字符
* @throws IOException
*/
private static void exer01() throws IOException {
//创建字符输入流对象
FileReader filereader = new FileReader(new File("a.txt"));
//定义变量保存数据
int b;
//读取字符
while((b = filereader.read()) != -1){
System.out.print((char) b);
}
//关闭资源
filereader.close();
}

private static void exer02() throws IOException {
//创建字符输入流对象
FileReader filereader = new FileReader(new File("a.txt"));
//创建数组
char[] buff = new char[2];
//读取数据
int i;
while((i = filereader.read(buff)) != -1){
System.out.print(buff);
}
//关闭流
filereader.close();
}
}