当使用字节流读取文本文件时,可能会有一个小问题。就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储。所以ava提供一些字符流类,以字符为单位读写数据,专门用于处理文本文件。

字符输入流【Reader】

java.io.Reader抽象类是表示用于读取字符流的所有类的超类,可以读取字符信息到内存中。它定义了字符输入流的基本共性功能方法。
public void close() :关闭此流并释放与此流关联的任何系统资源。
public int read() :从输入流读取一个字符。
public int read(char[] cbuf) :从输入流中读取一些字符,并将它们存储到字符数组cbuf中。

FileReader类

java.io.FileReader类是读取字符文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。

java. io. Reader:字符输入流,是字符输入流的最顶层的父类,定义了一些共性的成员方法,是一个抽象类

共性的成员方法:

int read() 读取单个字符并返回。
int read(char[] cbuf)-次读取多个字符,将字符读入数组。
void close()关闭该流并释放与之关联的所有资源。
java.io.FileReader extends InputstreamReader extends Reader
FileReader:文件字符输入流
作用:把硬盘文件中的数据以字符的方式读取到内存中

构造方法

FileReader(File file) :创建一个新的FileReader ,给定要读取的File对象。
ileReader (String fileName) :创建一个新的FileReader ,给定要读取的文件的名称。
FileReader(String fiLeName)FileReader(File file)

参数:读取文件的数据源

string fileName:文件的路径
File file:一个文件

FileReader构造方法的作用:

1,创建一个FileReader对象
2,会把FileReader对象指向要读取的文件

字符输入流的使用步骤:

1,创建FileReader对象,构造方法中绑定要读取的数据源
2.使用FileReader对象中的方法read读取文件
3.释放资源

  1. public static void main(String[] args) {
  2. //使用File对象创建流对象 T
  3. File file = new File("a.txt);
  4. FileReader fr = new FileReader (file);
  5. //使用文件名称创建流对象
  6. FileReader fr = new FileReader("b.txt");
  7. }
  1. public static void main(string[] args) throws IOException {
  2. //1.创建FileReader对象,构造方法中绑定要读取的数据源
  3. FileReader fr = new FileReader( fileName: "09_IOAndProperties\\c.txt");
  4. //2.使用FileReader对象中的方法read读取文件//int read()读取单个字符并返回。
  5. int len =0;
  6. while((len =fr.read())!=-1){
  7. System.out.println((char)len);
  8. }
  9. //int read(char[ cbuf)—次读取多个字符,将字符读入数组。
  10. char[] cs= new char[1024];/存储读取到的多个字将int ien = e;//记录的是每次读取的有效字符个数
  11. while((len = fr.read(cs))!=-1){
  12. /*
  13. String类的构造方法
  14. string(char[] value)把字符数组转换为字符串
  15. string(char[] value, int offset, int count)把字符数组的一部分转换为字符串 offset数组的开始索引count转换的个数
  16. */
  17. System.out.println(new string(cs,0,len));
  18. }
  19. //3.释放资源
  20. fr.close();
  21. }

字符输出流【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 lenl) 写入字符串的某一部分,of字符串的开始索引,len写的字符个数。
void flush()刷新该流的缓冲。
void close()关闭此流,但要先刷新它。

FileWriter类

java.io.Filevriter类是写出字符到文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。

java. io.Filelriter extends OutputStreamlriter extends Writer
Filewriter:文件字符输出流
作用:把内存中字符数据写入到文件中

构造方法.

Filewriter(File file)根据给定的File对象构造一个Filewriter对象。
Filelwriter(String fileName)根据给定的文件名构造一个Filewriter对象。

参数:写入数据的目的地

String fileName: 文件的路径
File file:是一个文件

构造方法的作用:

1.会创建一个Filewriter对象
2.会根据构造方法中传递的文件/文件的路径,创建文件
3.会把Filewriter对象指向创建好的文件

public static void main(String[] args) throws IOException {
//1.创建Filelwriter对象,构造方法中绑定要写入数据的目的地
Filewriter fw = new Filevriter( fileName: "09_IOAndProperties\\d.txt");
//2,使用Filewriter中的方法write,把数据写入到内存缓冲区中(字符转换为字节的过程)//void write(int c)写入单个字符。
fw.write(  97);
//3.使用Filewriter中的方法fLush,把内存缓冲区中的数据,刷新到文件中
fw.flush()
//刷新之后流可以继续使用
fw.write( c: 98);
//4.释放资源(会先把内存缓冲区中的数据刷新到文件中)
fw.close();
//close方法之后流已经关闭了,已经从内存中消失了,流就不能再使用了
fw.write( c: 99);

关闭和刷新

因为内置缓冲区的原因,如果不关闭输出流,无法写出字符到文件中。但是关闭的流对象,是无法继续写出数据的。如果我们既想写出数据,又想继续使用流,就需要flush方法了。
flush :刷新缓冲区,流对象可以继续使用。
close :先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了。

public class FWrite {
public static void main(String[] args) throws IOException {
//使用文件名称创建流对象
Filewriter fw = new Filewriter("fw.txt");
1/写出数据,通过flushfiw.write('刷');//写出第1个字符
fiw.flush();
fw.write(新); //继续写出第2个字符,写出成功
fiw.flush();
//写出数据通过c1ose
fiw.close();
}

字符输出流写数据的其他方法

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)写入字符串的某一部分,of字符串的开始索引, Len写的字符个数。

public class Fulrite {
public static void main(String[] args) throws IOException {
//使用文件名称创建流对象
Filewriter fw = new Filewriter ("fw.txt");
//字符串转换为字节数组
char[] chars="黑马程序员".tocharArray();
//写出字符数组
fw.write(chars);//黑马程序员
//写出从索引2开始,2个字节。索引12是'程',两个字节,也就是'程序.
fw.write(chars,2,2); //程序
//关闭资源fos.close();
}

续写和换行

续写,追加写:使用两个参数的构造方法
Filewriter(String fileName, boolean append)Filewriter(File file, boolean append)
参数:
String fileName, File file:写入数据的目的地
换行:换行符号
boolean append:续写开关true:不会创建新的文件覆盖源文件,可以续写; false:创建新的文件覆盖源文件
windows: IrinLinux:/n
mac:/n

public class Demoe4Writer {
public static void main(string[] args) throws IOException {
Filewriter fw = new Filewriter( fileName: "09_IOAndProperties\\g. txt", append: true);
for (int ie; i <1e; i++)
fw.write( str: "Hellollorld"+i+"\n");
}
fw.close();