字符流是一种用于读取和写入字符数据的输入输出流。与字节流不同,字符流以字符为单位读取和写入数据,而不是以字节为单位。常用来处理文本信息。
字符输入流
Reader 类是所有字符流输入类的父类,该类定义了许多方法,这些方法对所有子类都是有效的。
其实一般情况下我们使用最多也就是 FIleReader 和 BufferedReader;
注意点
- 与字节流相似,输入字符流在使用 buffer 时候没有加 close 关掉 buffer 也一样是可以把文件中的内容读取到控制台中的,相比输出字符流就必须要加上 buffer 的 close 方法了
- read 方法返回 int 型,也就是一个字符的 ascall 码,readLine 方法可以返回当前位置后一整行的字符串类型
- 如果 read 方法读不到字符了它会返回 -1,如果 readLine 方法读不到行了它会返回 null 的字符串
常用子类:
- CharArrayReader :将字符数组转换为字符输入流,从中读取字符。
- StringReader :将字符串转换为字符输入流,从中读取字符。
- BufferedReader :为其他字符输入流提供读缓冲区。
- PipedReader :连接到一个 PipedWriter。
- InputStreamReader :将字节输入流转换为字符输入流,可以指定字符编码。
子类必须实现得方法只有read(char[],int,int)和close(),但是多数子类将重写此处得定义得一些方法,以提高更高得效率或者其它功能;对文件得操作使用:使用FileReader类进行实例化操作。
- close():关闭此流并释放与此流相关的系统资源。
- read():从输入流读取一个字符。
- read(char[] cbuf):从输入流中读取一些字符,并将它们存储到字符数组 cbuf中
①、读取字符:read方法,每次可以读取一个字符,返回读取的字符(转为 int 类型),当读取到文件末尾时,返回-1。
②、读取指定长度的字符:read(char[] cbuf, int off, int len),并将其存储到字符数组中。其中,cbuf 表示存储读取结果的字符数组,off 表示存储结果的起始位置,len 表示要读取的字符数。
字符输出流
与 Reader 类相反,Writer 类是所有字符输出流的父类,该类中有许多方法,这些方法对继承该类的所有子类都是有效的。
子类必须要实现得方法仅有write(char[] ,int,int)、flush()和close();但是多数得子类将重写此处定义得一些方法,以提供更高得效率和或其它功能;
- write(int c) 写入单个字符。
- write(char[] cbuf) 写入字符数组。
- write(char[] cbuf, int off, int len) 写入字符数组的一部分,off为开始索引,len为字符个数。
- write(String str) 写入字符串。
- write(String str, int off, int len) 写入字符串的某一部分,off 指定要写入的子串在 str 中的起始位置,len 指定要写入的子串的长度。
- flush() 刷新该流的缓冲。
- close() 关闭此流,但要先刷新它。
Writer 类的常用子类:
- CharArrayWriter :向内存缓冲区的字符数组写数据。
- StringWriter :向内存缓冲区的字符串(StringBuffer)写数据。
- BufferedWriter :为其他字符输出流提供写缓冲区。
- PipedWriter :连接到一个 PipedReader。
- OutputStreamReader :将字节输出流转换为字符输出流,可以指定字符编码。
Writer 类中的 write() 方法和 append() 方法:
方法名及返回值类型 | 说明 |
---|---|
void write(int c) | 向输出流中写入一个字符 |
void write(char[] cbuf) | 把参数 cbuf 指定的字符数组中的所有字符写到输出流中 |
void write(char[] cbuf,int off,int len) | 把参数 cbuf 指定的字符数组中的若干字符写到输出流中。其中,off 指定字符数组中的起始下标,len 表示元素个数 |
void write(String str) | 向输出流中写入一个字符串 |
void write(String str, int off,int len) | 向输出流中写入一个字符串中的部分字符。其中,off 指定字符串中的起始偏移量,len 表示字符个数 |
append(char c) | 将参数 c 指定的字符添加到输出流中 |
append(charSequence esq) | 将参数 esq 指定的字符序列添加到输出流中 |
append(charSequence esq,int start,int end) | 将参数 esq 指定的字符序列的子序列添加到输出流中。其中,start 指定子序列的第一个字符的索引,end 指定子序列中最后一个字符后面的字符 的索引,也就是说子序列的内容包含 start 索引处的字符,但不包括 end 索引处的字符 |
注意:Writer 类所有的方法在出错的情况下都会引发 IOException 异常。关闭一个流后,再对其进行任何操作都会产生错误。
①、写入字符:write(int b) 方法,每次可以写出一个字符
②、写入字符数组:write(char[] cbuf) 方法,将指定字符数组写入输出流。
③、写入指定字符数组:write(char[] cbuf, int off, int len) 方法,将指定字符数组的一部分写入输出流。
④、写入字符串:write(String str) 方法,将指定字符串写入输出流。
⑤、写入指定字符串:write(String str, int off, int len) 方法,将指定字符串的一部分写入输出流。
/**
* 字符流:
* Write:写入字符流抽象类。子类必须要实现得方法仅有write(char[] ,int,int)、flush()和close();
* 但是多数得子类将重写此处定义得一些方法,以提供更高得效率和或其它功能;
* 与outputStream一样,对文件得操作使用:FileWrite类来完成。
* Reader:
* 用于读取字符流得抽象类。子类必须实现得方法只有read(char[],int,int)和close()。
* 但是多数子类将重写此处得定义得一些方法,以提高更高得效率或者其它功能;
* 对文件得操作使用:使用FileReader类进行实例化操作。
* 每次操作得单位是一个字符;
* 文件字符流操作会自带缓存,默认为1024字节,在缓存满后,或者手动刷新缓存,或者关闭流时候会把数据写入文件;
*/
public class 字符流 {
public static void main(String[] args) {
out();
in();
}
private static void out() {
File file1 = new File("F:\\workspace\\java基础\\src\\文件与IO\\file\\test02.txt");
try {
// 创建 FileReader 对象
Writer outWriter = new FileWriter(file1,true);
//Write 输出流的 flush() 操作是指,一般 IO 操作在有缓冲区的情况下,调用 close() 方法缓冲区才会被输出到磁盘中,
//如果直接执行 flush 可以在缓冲区没有满的时候手动输出一次到磁盘
outWriter.write("疑是地上霜");
outWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private static void in() {
File file2 = new File("F:\\workspace\\java基础\\src\\文件与IO\\file\\test02.txt");
try {
// 创建 FileReader 对象
Reader reader = new FileReader(file2);
char[] cs = new char[1];
int len = -1;
// 创建 StringBuilder 对象
StringBuilder stringBuilder =new StringBuilder();
// 循环读取数据,如果返回 -1, 则表示已经到了输入流的末尾。
while ((len=reader.read(cs))!=-1) {
stringBuilder.append(new String(cs,0,len));
}
// 关闭 FileReader 对象
reader.close();
System.out.println(stringBuilder);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
关于流得学习笔记!