因为一个中文字符算两个字节,如果按照字节流读取的话,可能只读半个中文字节,从而引入字符流,确保读入字符的准确性
1.字符输出流Writer
字符输出流Writer,对文件的操作使用子类 FileWriter
2.字符输入流Reader
字符输入流Reader,对文件的操作使用子类FileReader
特点:
* 每次的操作单位是一个字符
* 文件字符操作流r.read(ch)会自带缓存,默认大小为1024字节,在缓存满后,或手动刷新缓存,或关闭流时,会把数据写入文件
3.字节流和字符流的区别:
字符流的内部实现还是字节流
4.如何选择使用字节流还是字符流:
一般操作非文本文件时,如图片、视频等,使用字节流。操作文本文件时,使用字符流
5字符流代码示例:
package com.lemon;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
/**
* 字符流:
* 字符输出流Writer,对文件的操作使用子类 FileWriter
* 字符输入流Reader,对文件的操作使用子类FileReader
* 每次的操作单位是一个字符
* 文件字符操作流r.read(ch)会自带缓存,默认大小为1024字节,在缓存满后,或手动刷新缓存,或关闭流时,会把数据写入文件
* @author lemonSun
*
* 2019年5月4日下午1:06:22
*/
public class CharStreamDemo {
public static void main(String[] args) {
//out(); //输出流 向文件中写
in(); //输入流 从文件中读
}
private static void in() {
//确认目标文件
File file = new File("F:\\javatest\\lemon1.txt");
try {
Reader r = new FileReader(file);
StringBuilder sb = new StringBuilder();
char[] ch = new char[1];
int len = -1; //每次读取的长度
while((len = r.read(ch))!=-1) {
sb.append(new String(ch,0,len));
}
//关闭流
r.close();
//打印
System.out.println(sb);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private static void out() {
//确认目标文件
File file = new File("F:\\javatest\\lemon1.txt");
try {
//输出流
Writer w = new FileWriter(file,true);//追加内容
//写入
w.write("大河向东流");
//关闭流
w.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}