字符流(字符输入流和字符输出流)
概述
当使用字节流读取文本文件时,可能会有一个小问题。就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储。所以Java提供一些字符流类,以字符为单位读写数据,专门用于处理文本文件。
字符输入流Reader
java.io.Reader抽象类是标识用于读取字符流的所有类的超类,可以读取字符信息到内存中。它定义了字符输入流的基本共性功能方法。
磁盘-->内存
public void close():关闭此流并释放与此流相关联的任何系统资源。
public int read():从输入流读取一个字符。
public int read(char[] cbuf):从输入流中读取一些字符。
FileReader
java.io.FileReader类是读取字符文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。
作用:把硬盘文件中的数据以字符的方式读取到内存中。
Tips:字节与字符的对应规则。Windows系统的中文编码默认时GBK编码表。IDEA中utf-8。
构造方法:(红色为常用)
构造方法摘要 | |
---|---|
FileReader(File file) 在给定从中读取数据的 File 的情况下创建一个新 FileReader。 | |
FileReader(FileDescriptor fd) 在给定从中读取数据的 FileDescriptor 的情况下创建一个新 FileReader。 | |
FileReader(String fileName) 在给定从中读取数据的文件名的情况下创建一个新 FileReader。 |
参数:String name文件路径;File file文件
构造方法的作用:
1.创建一个FileReader对象
2.会把FileReader对象指向要读取的文件
字符输入流的使用步骤:
1.创建FileReader对象,构造方法中绑定要读取的数据源;
2.使用FileReader对象中的方法read读取文件;
3.释放资源。
// 创建FileReader对象,构造方法中绑定要读取的数据源; FileReader fr = new FileReader("D:\\a\\a.txt"); // 使用FileReader对象中的方法read读取文件 int len = 0; while((len = fr.read()) != -1){ // 读到末尾 // 一个字符-->ASCII码对应 // 你-->20320 System.out.println(len); // 你-->20320-->你 System.out.println((char)len); // 大到小,强制转换 } fr.close(); // 释放资源
// int read(char[] cbuf)一次读取读个字符,将字符读入数组。 char[] cs = new char[1024]; // 存储读取到的多个字符 int len = 0; // 记录每次读取的有效字符个数 while((len = fr.read(cs)) != -1){ /* String类的构造方法 String(char[] value)把字符数组转换为字符串 String(chaar[] value,int offset,int count)把字符数组的一部分转换为字符串 offset数组的开始索引,count转换的个数 */ System.out.println(new String(cs,0,len)); } fr.close(); // 释放资源
字符输出流Writer
java.io.Writer抽象类时标识用于写出字符流的所有类的超类,将指定的字符信息写出到目的地。它定义了字节输出流的基本共性功能方法。
void write(int c):写入单个字符
void write(char[] cbuf):写入字符数组
abstract void write(char[] cbuf,int off,int len):写入字符数组的某一部分,off数组的开始索引,len写的字符个数
void write(String str):写入字符串
void write(String str,int off,int len):写入字符串的某一部分,off字符串的开始索引,len写的字符个数
void flush():刷新该流的缓冲
void close():关闭此流,但要先刷新它。
FileWriter类
java.io.FileWriter类是写出字符到文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。
作用:把内存中的字符数据写入到文件中
构造方法:(红色为常用)
构造方法摘要 | |
---|---|
FileWriter(File file) 根据给定的 File 对象构造一个 FileWriter 对象。 | |
FileWriter(File file, boolean append) 根据给定的 File 对象构造一个 FileWriter 对象。 | |
FileWriter(FileDescriptor fd) 构造与某个文件描述符相关联的 FileWriter 对象。 | |
FileWriter(String fileName) 根据给定的文件名构造一个 FileWriter 对象。 | |
|
参数:写入数据的目的地
String name 文件路径;File file 文件
构造方法作用:
1.创建一个FileWriter对象;
2.会根据构造方法中传递的文件/文件路径,创建文件;
3.会把FileWriter对象指向创建好的文件。
字符输出流的使用步骤:
1.创建一个FileWriter对象;
2.构造方法中绑定要写入数据的目的地;
3.使用FileWriter对象中的方法writer,把数据据写入到内存缓冲区(字符转换为字节的过程)中;
4.使用FileWriter对象中的方法flush,把内存缓冲区中的数据,刷新到文件中;
4.释放资源(会把内存缓冲区中的数据刷新到文件中,故flush可不写)。
FileWriter fw = new FileWriter("D:\\a\\abc.txt"); // 97-->a fw.write(97); fw.flush(); // 如果都不写,则在缓冲区,没有刷新进文件中 fw.close();
flush方法和close方法的区别(关闭和刷新)
因为内置缓冲区的原因,如果不关闭输出流,无法写出字符到文件中。但是关闭的流对象,是无法继续写出数据的。如果我们既想写出数据,又想继续使用流,就需要flush方法。
flush:刷新缓冲区,流对象可以继续使用。
close:先刷新缓冲区,然后通知系统释放资源,流对象不可以再被使用了。
fw.write(97); fw.flush(); fw.write(98); fw.close();
运行截图:
写出其他数据
1.写出字符数组:write(char[] cbuf)和write(char[] cbuf,int off,int len),每次可以写出字符数组中的数据,用法类似于FileOutStream。
FileWriter fr = new FileWriter("D:\\a\\bc.txt"); // 写入字符数组 char[] cs = {'1','2','3','a','d','你'}; fr.write(cs); // 同样进入字符数组进行字符-->字节转换,需要刷新 fr.flush(); // 123ad你 //写入字符数组一部分 fr.write(cs,1,2); fr.flush(); // 23
2.写出字符串:write(String str)和write(String str,int off,int len),每次可以写出字符串中的数据或部分数据,用法类似于FileOutStream。
// 写出字符串 fr.write("好呀!"); fr.flush(); // 好呀! // 写出字符串的一部分 fr.write("我是猪猪",1,2); fr.flush(); // 是猪
续写和换行
操作类似于FileOutputStream。
FileWriter(String name/File file,boolean append)
参数:append:续写开关。
true不会创建新的文件覆盖源文件,可以续写;默认false,创建新的文件覆盖源文件。
FileWriter fw = new FileWriter("D:\\a\\bc.txt",true); // 允许续写 fw.write(new char[]{'1','2'}); fw.write("\r\n"); fw.write("你们好"); fw.flush(); /* 123ad你23好呀!是猪12 你们好 */ fw.close();
Tips:字符流,只能操作文本文件,不能操作图片,视频等非文本文件,当我们单纯读或写文本文件时,使用字符流,其他情况使用字节流。