=======
之前我们学了FileInputStream字节流,今天是输入字符流
字节流只能读取字节数据,且因为是需要一个字节,所以汉字读取不了,要读取需要用缓存数组的方式
FileInputStream默认是用GBK码表,FileReader也是GBK码表,但是它自带了解码功能
public abstract class Reader 所有读字符流的超类,因为是抽象的,所 以要用实现类
-----------------FileReader
用法和之前的FileInputStream一样,特性也一样
public abstract class Writer所有写字符流的超类,因为是抽象的,所以要用实现类
-----------------FileWriter
而FileWriter的用法却是和BufferedOutputStream一样,因为FileWriter里面也维护了
一个缓冲数组,然后还需要刷出,刷出还是一样有3个方式,flush,close,还有就是字符数组满了也会刷出
特性和要注意的地方和FileOutputStream一样
注意:
1 用FileInputStream整体来说还是不能读取正常文字,如果2汉字中间有一个字母,因为读取的是字节,所以要读5个字节
我们缓冲数组填的是4或者4的整数倍,也就是偶数,也就是说总会读出乱码的
2 字节流和字符流的应用场景,字符流只有在我们能看懂的数据处可以使用,比如记事本里的正常文本
而字节流最好是用在我们看不见的数据处,比如图片里的数据,我们能看到图片,但是我们看不懂图片里的数据
因为图片不是文字,有些码在编码表里面是转不了的,这些转不了的码就会变成1个字节返回,所以我们的文件比原来的字节少了
所以复制出来的图片是损坏的。这种情况下是要使用字节流的
读取完整的字符
public static void main(String[] args) throws IOException
{
//用字符流FileWriter读取完整数据
File file1 = new File("D:\\a.txt");
FileReader fileReader1 = new FileReader(file1);
char[] arr = new char[4];
int length = 0;
StringBuilder sbd_1 = new StringBuilder();
while ((length = fileReader1.read(arr)) != -1)
{
sbd_1.append(arr);
}
System.out.println(sbd_1);
}
输出字符串
class Test
{
public static void main(String[] args) throws IOException
{
File file1=new File("D:\\1.txt");
FileWriter fileWriter1=new FileWriter(file1);
String string="gsa ds感受 dg到 sdh%@6gdseyyfdhj 单方事故";
fileWriter1.write(string,0,string.length());
fileWriter1.close(); //关闭才会刷出内容
}
}