字符流
当使用字节流读取文本文件时,可能会有一个小问题。
就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储。
所以Java提供一些字符流类,以字符为单位读写数据,专门用于处理文本文件。
字符输入流
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();
}
}
字符输出流
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();
}
}