字符流树图
一般用于处理文档数据如:文本文件
1.字符输入流Reader
我们读取拥有中文的文件时,使用的字节流在读取,那么我们读取到的都是一个一个字节。只要把这些字节去查阅对应的编码表,就能够得到与之对应的字符。API中是否给我们已经提供了读取相应字符的功能流对象,Reader,读取字符流的抽象超类。
int read():读取单个字符并返回
int read(char[]):将数据读取到数组中,并返回读取的个数。
1.1.FileReader类
FileReader是用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的
构造方法:
FileReader(File file);//通过文件的File创建字符输入流
FileReader(String path);//通过文件的路径创建输入流
1.1.2.FileReader读取包含中文的文件
public class CharStreamDemo {
public static void main(String[] args) throws IOException {
//给文件中写中文
writeCNText();
//读取文件中的中文
readCNText();
}
//读取中文
public static void readCNText() throws IOException {
FileReader fr = new FileReader("D:\\test\\cn.txt");
int ch = 0;
while((ch = fr.read())!=-1){
//输出的字符对应的编码值
System.out.println(ch);
//输出字符本身
System.out.println((char)ch);
}
}
//写中文
public static void writeCNText() throws IOException {
FileOutputStream fos = new FileOutputStream("D:\\test\\cn.txt");
fos.write("千峰java欢迎你".getBytes());
fos.close();
}
}
1.2.字符缓冲输入流BufferedReader
从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
方法
public String readLine()
读取一个文本行(即:读取一行),包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null
/*
* BufferedReader 字符缓冲输入流
*
* 方法:
* String readLine()
* 需求:从文件中读取数据,并显示数据
*/
public class BufferedReaderDemo {
public static void main(String[] args) throws IOException {
//1,创建流
BufferedReader in = new BufferedReader(new FileReader("file.txt"));
//2,读数据
//一次一个字符
//一次一个字符数组
//一次读取文本中一行的字符串内容
String line = null;
while( (line = in.readLine()) != null ){
System.out.println(line);
}
//3,关闭流
in.close();
}
}
2.字符输出流Writer
Writer是写入字符流的抽象类。其中描述了相应的写的动作。
void write(int c);//写入一个字符
void write(char[] cbuf);//写入一个字符数组
abstract void write(char[]) cbuf,int off,int len);//写入数组的一部分
void write(String str);//写入一个字符串
void write(String str,int off,int len);//写入字符串的一部分
2.1.FileWriter类
FileWriter是用来写入字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可接受的。
构造方法:
FileWriter(File file);//通过文件的File创建输出流对象
Filewriter(File file,boolean append);//通过文件的File创建输出流对象,apped为true时在文件末尾写入
FileWriter(String path);//通过文件的路径创建输出流对象
FileWriter(String path,boolean append);//通过文件的路径创建输出流对象,当append为true时在文件末尾写入
2.1.1.FileWriter写入中文到文件中
写入字符到文件中,先进行流的刷新,再进行流的关闭
public class FileWriterDemo {
public static void main(String[] args) throws IOException {
//演示FileWriter 用于操作文件的便捷类。
FileWriter fw = new FileWriter("d:\\text\\fw.txt");
fw.write("你好谢谢再见");//这些文字都要先编码。都写入到了流的缓冲区中。
fw.flush();
fw.close();
}
}
2.1.2.flush()和close()的区别
- flush():将流中的缓冲区缓冲的数据刷新到目的地中,刷新后,流还可以继续使用。
- close():关闭资源,但在关闭前会将缓冲区中的数据先刷新到目的地,否则丢失数据,然后在关闭流。流不可以使用。如果写入数据多,一定要一边写一边刷新,最后一次可以不刷新,由close完成刷新并关闭。
2.2.字符缓冲输出流BufferedWriter
将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
方法:
void newLine();//根据当前的系统,写入一个换行符
/*
* BufferedWriter 字符缓冲输出流
* 方法
* public void newLine()写入一个行分隔符
*
* 需求: 通过缓冲输出流写入数据到文件
* 分析:
* 1,创建流对象
* 2,写数据
* 3,关闭流
*
*/
public class BufferedWriterDemo {
public static void main(String[] args) throws IOException {
//创建流
//基本字符输出流
FileWriter fileOut = new FileWriter("file.txt");
//把基本的流进行包装
BufferedWriter out = new BufferedWriter(fileOut);
//2,写数据
for (int i=0; i<5; i++) {
out.write("hello");
out.newLine();
}
//3,关闭流
out.close();
}
}