I/0流之字符流相关知识
字符流
1、说明
除了字符流,JDK还提供了用于实现字符操作的字符流,同字节流一样,字符流也有两个抽象的顶级父类,分别是Reader 和 Writer。
(用字节流输出中文,可能会出现中文乱码问题,所以这时候便要利用到字符流)
2、相关代码
public class Demo1{
public static void main(String[] args) throws IOException{
FileInputStream fis = new FileInputStream("b.txt");
byte[] bys = new byte[2];
int i;
while((i=fis.read(bys))!=-1){
System.out.println(new String(bys,0,i));
}
fis.close();
}
}
3、字符流操作文件
3.1 字符流的作用
操作纯文本文件的时候,可以解决中文乱码问题。
(注意:字符流只能操作纯文本文件)
3.2 解决中文乱码的方式
字符流底层实际上是通过(字节流+编码表)的形式进行读取的,在读取之后,会根据平台默认码表决定一次读取多少个字节,并在内存中转换为字符。
GBK ——> 一个中文占2个字节
UTF-8 ——> 一个中文占3个字节
3.3 判断标准
字符流底层有一个判断,
如果读取到的是中文字符,一次读取2个字节(GBK),
如果读取到的是非中文字符,一次读取1个字节,
其中中文字符一般都是负数的字节,部分是第一个字节为负数,后面的字节有可能为正数,
非中文字符都是正数。
3.4 FileWriter ——> 字符输出流
3.4.1 注意
如果字符输出流没有调用close方法、flush方法的话,数据将不会写出到文件中
3.4.2 flush和close方法的区别
(1)flush方法是将数据刷出到文件中去,刷出后可以继续调用write方法写出
(2)close方法的主要功能是关闭流释放资源,同时也具有刷出数据的效果
(3)close方法调用结束后,不能再调用write方法写出数据
3.4.3 相关代码
public static void main(String[] args) throws IOException{
FileWrite fw = new FileWriter("c.txt");
//1.写出一个字符
fw.write('a');
//2.写出一个字符数组
char[] cbs = {'1','2','3','4'};
//3.写出一个字符数组的一部分
fw.write(cbs,0,2);
//4.写出一个字符串
fw.write("你好你好");
//5.写出字符串的一部分
fw.write("你好你好",0,1);
fw.close();
}
4、字符缓冲流
BufferedInputStream
BufferedOutputStream
BufferedReader
readLine() -> 一次读取一整行字符串,同时结束标记是null,不会读取到回车换行符
BufferedWriter
newLine() -> 写出回车换行,但是此方法具有跨平台效果
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new FileReader("a.txt"));
BufferedWriter br = new BufferedWriter(new FileWriter("bufferCopy.txt"));
String line;
while((line = br.readLine())!=null){
bw.write(line);
}
br.close();
bw.close();
}