字符流的使用
一、字符流概述
1、字节流读取中文输出可能会存在什么问题?
●会乱码。或者内存溢出。
2、读取中文输出,哪个流更合适,为什么?
●字符流更合适,最小单位是按照单个字符读取的。
二、文件字符输入流(一次读取一个字符)
(1)作用
文件字符输入流:Reader
●作用:以内存为基准,把磁盘文件中的数据以字符的形式读取到内存中去。
(2)所用构造器与方法
构造器 | 说明 |
---|---|
public FileReader(File file) | 创建字符输入流管道与源文件对象接通 |
public FileReader(String pathname) | 创建字符输入流管道与源文件路径接通 |
方法名称 | 说明 |
---|---|
public int read() | 每次读取一个字符返回,如果字符已经没有可读的返回-1 |
public int read(char[] buffer) | 每次读取一个字符数组,返回读取的字符个数,如果字符已经没有可读的返回-1 |
(3)具体使用
public class FileReadDemo01 {
public static void main(String[] args) throws IOException {
//目标:每次读取一个字符。
//1、创建一个字符输入流管道与源文件接通
Reader fr = new FileReader("F:\\code\\SummerTry\\Summerday22\\data");
//2、读取一个字符返回,没有可读的字符了返回-1
// int code = fr.read();
// System.out.print((char) code);//你
//
// int code2 = fr.read();
// System.out.print((char) code2);//你爱
// 3、使用循环读取字符
int code;
while ((code = fr.read()) != -1){
System.out.print((char) code);
}
}
}
(4)总结
①文件字符输入流,每次读取一个字符的api是哪个?
方法名称 | 说明 |
---|---|
public int read() | 每次读取一个字符返回,如果字符已经没有可读的返回-1 |
②字符流的好处,以及每次读取一个字符存在什么问题?
●读取中文字符不会出现乱码(如果代码和文件编码一致)
●性能较慢
三、文件字符输入流(次读取一个字符数组)
(1)作用
文件字符输入流:Reader
●作用:以内存为基准,把磁盘文件中的数据以字符的形式读取到内存中去。
(2)所用构造器与方法
构造器 | 说明 |
---|---|
public FileReader(File file) | 创建字符输入流管道与源文件对象接通 |
public FileReader(String pathname) | 创建字符输入流管道与源文件路径接通 |
方法名称 | 说明 |
---|---|
public int read() | 每次读取一个字符返回,如果字符已经没有可读的返回-1 |
public int read(char[] buffer) | 每次读取一个字符数组,返回读取的字符个数,如果字符已经没有可读的返回-1 |
(3)具体使用
public class FileReadDemo02 {
public static void main(String[] args) throws IOException {
//目标:每次读取一个字符。
//1、创建一个字符输入流管道与源文件接通
Reader fr = new FileReader("F:\\code\\SummerTry\\Summerday22\\data01");
// 3、使用循环,每次读取一个字符数组的数据
char[] buffer = new char[1024];//1024个字符
int len;
while ((len = fr.read(buffer)) != -1){
String rs = new String(buffer,0,len);
System.out.print(rs);
}
}
}
(4)总结
①文件字符输入流,每次读取一个字符数组的api是哪个?
方法名称 | 说明 |
---|---|
public int read(char[] buffer) | 每次读取一个字符数组,返回读取的字符个数,如果字符已经没有可读的返回-1 |
②每次读取一个字符数组的优势?
●读取的性能得到了提升
四、文件字符输出流
(1)文件字符输出流(FileWriter) 写数据出去的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) | 写一个字符串的一部分 |
(2)流的关闭与刷新
public class FileWriterDemo01 {
public static void main(String[] args) throws IOException {
// 1、创建一个字符输出流管道与目标文件接通
//Writer fw = new FileWriter( "F:\\code\\SummerTry\\Summerday22\\data02.txt"); //覆盖管道,每次启动都会清空之前的数据
Writer fw = new FileWriter( "F:\\code\\SummerTry\\Summerday22\\data02.txt", true); //追加管道
// a.public void write(int c):写一个字符出去
fw.write('a');
fw.write(66);
fw.write('徐');
fw.write("\r\n");//换行
// b.public void write(String c)写一个字符串出去
fw.write("我爱你abc123");
fw.write("\r\n");//换行
// c.public void write(char[] buffer): 写一个字符数组出去
char[] chars = "abc撒拉嘿".toCharArray();
fw.write(chars);
fw.write("\r\n");//换行
// d.public void write(String c , int pos , int Len): 写字符串的一部分出去
fw.write("ilove哈哈哈",0,5);//ilove
fw.write("\r\n");//换行
// e.public void write(char[] buffer ,int pos ,int len): 写字符数组的一部分出去
char[] chars1 = "defg撒拉嘿".toCharArray();
fw.write(chars,0,3);//def
fw.write("\r\n");//换行
//fw.flush();;//刷新后流可以继续使用
fw.close();//关闭包含刷线,关闭后流不能使用
}
}
Writer fw = new FileWriter( “F:\code\SummerTry\Summerday22\data02.txt”, true);
//追加管道,数据不会被覆盖
第一次运行:
第二次运行:
第三次运行:
(3)总结
字节流、字符流如何选择使用?
●字节流适合做一切文件数据的拷贝(音视频,文本)
●字节流不适合读取中文内容输出
●字符流适合做文本文件的操作(读,写)