67.输入输出字符流

Posted 江小白谢

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了67.输入输出字符流相关的知识,希望对你有一定的参考价值。

IO分类:
按照数据流向分类:
    输入流
    
    输出流

按照处理的单位划分:
    字节流:字节流读取的都是文件中的二进制数据,读取到的二进制数据不会经过任何处理
    
    字符流:字符流读取的数据都是以字符为单位的,字符流也是读取的文件的二进制数据,只不过会把这些二进制数据转换成我们能识别的字符
            字符流 =  字节流 + 解码

英文占一个字节
中文占两个字节

我们知道字节流之所以可以读数据,因为我们在字符和字节之间转换原因。我们定义缓存字节数组是为了提高我们的效率,
但是如果字节数组长度如果小于我们需要读取的文本字节大小,那么可能会出现乱码的现象

例如:我们需要读取3个文字,而我们定义的字节数组大小是5,那么最后一个文字是不是只读了一半,就算我们把字节数组长度定义为2并循环读取3次
那么如果里面有英文了,这里就不是很好处理(在之前之所以没出现乱码是因为我们定义的字节数组足够大)
其实你可以用无参的read方法读取数据,无参的read方法每次自能读取一个字节,读取文字会出现乱码(前面我们读取的是英文)

而sun公司就给我们提供了一个字符流,它内部可以分辨我们要读的数据是否为英文或者是中文等其他语言来进行读取,并给我们解码

输入字符流:
--------------| Reader 输入字符流的基类。 抽象类
----------| FileReader 读取文件的输入字符流


输出字符流:
--------------| Write  输出字符流的基类。 抽象类
----------| FileWrite  向文件输入数据

注意:FileWrite内存中有一个8kb的字符数组,当我们使用write方法时,是把数据写入了数组中,并不是文本里面,
除非我们使用close,flush方法,或者是数组存满了,才会把数据输入到文本中

public class Demo2 {
    public static void main(String[] args) throws IOException {
        File file = new File("D:\\新建文件夹\\1.txt");
        System.out.println("原来的数据:"+readText(file));
        writeText(file);
        System.out.println("现在的数据:"+readText(file));
    }
    
    //读取文本里面的内容
    public static String readText(File file) throws IOException {
        FileReader fileReader = new FileReader(file);
        char[] cs = new char[1024];
        int length = 0;
        String str = "";
        while((length = fileReader.read(cs))!=-1) {
            str += new String(cs,0,length);
        }
        fileReader.close();
        return str;
        
    }
    
    //写入文本
    public static void writeText(File file) throws IOException{
        FileWriter fileWriter = new FileWriter(file,true);
        fileWriter.write("这个是添加的文字");
        fileWriter.close();
    }
}

 

以上是关于67.输入输出字符流的主要内容,如果未能解决你的问题,请参考以下文章

学习总结 java 输入输出流

IO流之字符输入流,字符输出流

片段(Java) | 机试题+算法思路+考点+代码解析 2023

第2章 字符流与字节流

IO编程__字符流__输入输出

IO编程__缓冲字符流__输入输出