IO流学习--字符流

字符流底层其实就是字节流

字符流=字节流+字符集

特点:

输入流:一次读取一个字节,遇到中文时,一次读取多个字节。

输出流:底层会把数据按照指定的编码方式进行编码,变成字节再写到文件中。

使用场景:对纯文本文件进行读写操作。


FileReader        操作本地文件的字符输入流

构造方法:

public FileReader(File file)        创建字符输入流关联本地文件
public FileReader(String pathname)  创建字符输入流关联本地文件

细节:如果文件不存在,就直接报错。

 成员方法:  读取数据

public int read()                   读取数据,读到末尾返回-1
public int read(char[] buffer)      读取多个数据,读到末尾返回-1

细节1:按字节进行读取,遇到中文,一次读多个字节,读取后解码,返回一个整数。

细节2:读到文件末尾了,read方法返回-1。

 空参的read方法:

public class CharStreamDemo1 {
    public static void main(String[] args) throws IOException {
        /*
            第一步:创建对象
                public FileReader(File file)        创建字符输入流关联本地文件
                public FileReader(String pathname)  创建字符输入流关联本地文件
            第二步:读取数据
                public int read()                   读取数据,读到末尾返回-1
                public int read(char[] buffer)      读取多个数据,读到末尾返回-1
            第三步:释放资源
                public void close()                 释放资源/关流
        */

        //1.创建对象并关联本地文件
        FileReader fr = new FileReader("myio\\a.txt");
        //2.读取数据 read()
        //字符流的底层也是字节流,默认也是一个字节一个字节的读取的。
        //如果遇到中文就会一次读取多个,GBK一次读两个字节,UTF-8一次读三个字节

        //read()细节:
        //1.read():默认也是一个字节一个字节的读取的,如果遇到中文就会一次读取多个
        //2.在读取之后,方法的底层还会进行解码并转成十进制。
        //  最终把这个十进制作为返回值
        //  这个十进制的数据也表示在字符集上的数字
        //  英文:文件里面二进制数据 0110 0001
        //          read方法进行读取,解码并转成十进制97
        //  中文:文件里面的二进制数据 11100110 10110001 10001001
        //          read方法进行读取,解码并转成十进制27721

        // 我想看到中文汉字,就是把这些十进制数据,再进行强转就可以了
        int ch;
        while((ch = fr.read()) != -1){
            System.out.print((char)ch);
        }
        //3.释放资源
        fr.close();
    }
}

带参的read方法:

public class CharStreamDemo2 {
    public static void main(String[] args) throws IOException {
        /*
            第一步:创建对象
            public FileReader(File file)        创建字符输入流关联本地文件
            public FileReader(String pathname)  创建字符输入流关联本地文件
            第二步:读取数据
            public int read()                   读取数据,读到末尾返回-1
            public int read(char[] buffer)      读取多个数据,读到末尾返回-1
            第三步:释放资源
            public void close()                 释放资源/关流
        */
        
        //1.创建对象
        FileReader fr = new FileReader("myio\\a.txt");
        //2.读取数据
        char[] chars = new char[2];
        int len;
        //read(chars):读取数据,解码,强转三步合并了,把强转之后的字符放到数组当中
        //空参的read + 强转类型转换
        while((len = fr.read(chars)) != -1){
            //把数组中的数据变成字符串再进行打印
            System.out.print(new String(chars,0,len));
        }
        //3.释放资源
        fr.close();
    }
}

FileWriter        操作本地文件的字符输出流

构造方法:

public FileWriter(File file)                        创建字符输出流关联本地文件
public FileWriter(String pathname)                  创建字符输出流关联本地文件
public FileWriter(File file,  boolean append)       创建字符输出流关联本地文件,续写
public FileWriter(String pathname,  boolean append) 创建字符输出流关联本地文件,续写

细节1:参数是字符串表示的路径或者File对象都是可以的。

细节2:如果文件不存在会创建一个新的文件夹,但是要保证父级路径是存在的。

细节3:如果文件已经存在,则会清空文件,如果不想清空可以打开续写开关。

 成员方法:

void write(int c)                           写出一个字符
void write(String str)                      写出一个字符串
void write(String str, int off, int len)    写出一个字符串的一部分
void write(char[] cbuf)                     写出一个字符数组
void write(char[] cbuf, int off, int len)   写出字符数组的一部分

细节:如果write方法的参数是整数,但是实际上写到本地文件中的是整数在字符集上的对应的字符。

 

public class CharStreamDemo3 {
    public static void main(String[] args) throws IOException {
     /*
      第一步:创建对象
      public FileWriter(File file)                        创建字符输出流关联本地文件
      public FileWriter(String pathname)                  创建字符输出流关联本地文件
      public FileWriter(File file,  boolean append)       创建字符输出流关联本地文件,续写
      public FileWriter(String pathname,  boolean append) 创建字符输出流关联本地文件,续写

      第二步:读取数据
      void write(int c)                           写出一个字符
      void write(String str)                      写出一个字符串
      void write(String str, int off, int len)    写出一个字符串的一部分
      void write(char[] cbuf)                     写出一个字符数组
      void write(char[] cbuf, int off, int len)   写出字符数组的一部分

      第三步:释放资源
      public void close()                 释放资源/关流

      '我'    25105
     */
        FileWriter fw = new FileWriter("myio\\a.txt",true);

        //fw.write(25105);
        //fw.write("你好威啊???");
        char[] chars = {'a','b','c','我'};
        fw.write(chars);

        fw.close();
    }
}

字符流输入流原理解析:    

1. 创建字符流对象

        底层:关联文件,并创建缓冲区(长度为8192的字节数组)。超过8192个字节,缓冲区里的数据会重新覆盖。

2. 读取数据

        底层: 判断缓冲区中是否有数据可以读取

        缓冲区中没有数据:就从文件中获取数据,装到缓冲区中,每次尽可能装满缓冲区,如果缓冲区中也没有数据了,返回-1

        缓冲区中有数据:就从缓冲区中读取。

        空参的read方法:一次读取一个字节,遇到中文一次读多个字节,把字节解码并转成十进制返回。十进制:英文或者汉字在字符集中对应的数字,想看到英文或汉字还需要进行强转成char类型。

        有参的read方法:把读取字节,解码,强转三步合并了,强转之后的字符放到数组中。

3. 释放资源

    

字符流输出流原理解析:

1. 创建字符流对象

        底层:关联文件,并创建缓冲区(长度为8192的字节数组)。字节流没有缓冲区,直接写到文件目的地。

2. 写出数据

        字符流是写入缓冲区中,什么时候写入到本地文件中?

        如果缓冲区满了会自动地把数据保存到文件;或者手动刷新,不管缓冲区有没有装满,通过flash方法可以实现直接保存到文件中;释放资源时,通过close方法关流,把缓冲区中的数据保存到本地。

        flash刷新:刷新之后,还可以继续往文件中写出数据。文件与内存的那个通道还在。

        close关流:断开通道,无法再往文件中写出数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梧桐小玉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值