06 字符流的使用
1 一次读取一个字符
(1) 字节流读取中文输出会存在什么问题?
● 会出现乱码、内存溢出。
(2) 读取中文输出,哪个流更适合,为什么?
● 字符流更合适,最小单位是按照单个字符读取的。(缺点:性能较慢 )
文件字符输入流:Reader
● 作用:以内存为基准,把磁盘文件中的数据以字符的形式读取到内存中去。
构造器 | 说明 |
public FileReader(File file) | 创建文件字符输入流管道与源文件对象接通 |
public FileReader(String pathname) | 创建字符输入流管道与源文件路径接通 |
方法名称 | 说明 |
public int read( ) | 每次读取一个字符返回,没有则返回-1 |
public int read(char[] buffer) | 每次读取一个字符数组返回,返回读取的个数,没有则返回-1 |
【案例】
public class FileReaderDemo01 {
public static void main(String[] args) throws Exception {
//目标:每次读取一个字符
//1.创建一个字符输入流管道与源文件接通
Reader fr = new FileReader("file-io-app\\src\\date06.txt");
//2.读取一个字符返回,没有则返回-1
// int code = fr.read(); //每次读取的是字符编号
// System.out.println((char)code); //墙
//
// int code2 = fr.read();
// System.out.println((char)code2); //里
//3.使用循环读取字符
int code;
while((code=fr.read()) != -1){
System.out.print((char)code);
}
}
}
运行结果:
墙里秋千墙外道,墙外行人,墙里佳人笑。
笑声不闻声渐消,多情却被无情恼。
2 一次读取一个字符数组
文件字符输入流:FileReader
● 作用:以内存为基准,把磁盘文件中的数据以字符形式读取到内存中去。
● 读取性能得到提升
方法名称 | 说明 |
public int read( ) | 每次读取一个字符返回,没有则返回-1 |
public int read(char[] buffer) | 每次读取一个字符数组返回,返回读取的个数,没有则返回-1 |
【案例】
public class FileReaderDemo02 {
public static void main(String[] args) throws Exception {
//1.创建一个文件字符输入流与源文件接通
Reader fr = new FileReader("file-io-app\\src\\data07.txt");
//2.用循环,每次读取一个字符数组的数据 1024 + 1024 + 8
char[] buffer = new char[1024]; // 1k字符
int len;
while((len = fr.read(buffer)) != -1){
String rs = new String(buffer,0,len);
System.out.println(rs);
}
}
}
运行结果:
虞美人 —— 李煜
春花秋月何时了?往事知多少。小楼昨夜又东风,故国不堪回首月明中。
雕栏玉砌应犹在,只是朱颜改。问君能有几多愁?恰似一江春水向东流。
3 文件字符输出流
文件字符输出流:FileWriter
作用:以内存为基准,把内存中的数据以字符的形式写出到磁盘文件中去的流。
构造器 | 说明 |
public FileWriter(File file) | 创建字符输出流管道与源文件对象接通 |
public FileWriter(File file, boolean append) | 创建字符输出流管道与源文件对象接通,可追加数据 |
public FileWriter(String filepath) | 创建字符输出流管道与源文件路径接通 |
public FileWriter(String filepath, boolean append) | 创建字符输出流管道与源文件路径接通,可追加数据 |
常用API
方法名称 | 说明 |
void write(int c) | 写一个字符 |
void write(char[] cbuf) | 写入一个字符数组 |
void write(char[] cbuf, int off, int len) | 写入字符数组的一部本 |
void write(String str) | 写一个字符串 |
void write(String str, int off, int len) | 写如一个字符串的一部分 |
流的关闭于刷新
方法名称 | 说明 |
flush( ) | 刷新流,还可以继续写数据 |
close( ) | 关闭流,释放资源,但是在关闭之前会先刷新流。一旦关闭,就不能再写数据 |
【案例】
public class FileWriterDemo03 {
public static void main(String[] args) throws IOException {
//1.创建一个字符输出流管道于目标文件接通
FileWriter fw = new FileWriter("file-io-app\\src\\out08.txt"); //覆盖管道,每次启动都会清空文件之前的数据
//FileWriter fw = new FileWriter("file-io-app\\src\\out08.txt",true); //可追加
//2. public void write(int c) :写一个字符出去
fw.write(99);
fw.write('a');
fw.write('叶');
fw.write("\r\n"); //换行
//3. public void write(String c) :写一个字符串出去
fw.write("abc我是中国人");
fw.write("\r\n"); //换行
//4. public void write(char[] buffer) :写一个字符数组出去
char[] chars = "abc我是中国人".toCharArray(); //转为字符数组
fw.write(chars);
fw.write("\r\n");
//5. public void write(String c,int pos,int len) :写字符串的一部分出去
fw.write("abc我是中国人",0,5);
fw.write("\r\n");
//6. public void write(char[] buffer ,int pos ,int len):写字符数组的一部分出去
fw.write(chars, 3, 5);
fw.write("\r\n"); // 换行.
//fw.flush(); //刷新后流可以继续使用
fw.close(); //关闭包含刷新,关闭后流不能使用
}
}
运行结果(out08.txt):
ca叶
abc我是中国人
abc我是中国人
abc我是
我是中国人
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
2022-05-13 电商数据仓库系统