java io流 总结③

字符流

字符流:就是在字节流的基础上,加上编码,形成的数据流 字符流底层还是字节流

字符流出现的意义:因为字节流在操作字符时,可能会有中文导致的乱码,所以由字节流引申出了字符流。

java中字节流与字符流的区别:

1、读写的时候一个是按字节读写,一个是按字符。

2、在读写文件需要对内容按行处理,比如比较特定字符,处理某一行数据的时候一般会选择字符流。只是读写文件,和文件内容无关的,一般选择字节流。

3、以stream结尾都是字节流,reader和writer结尾都是字符流。

4、InputStream是所有字节输入流的父类,OutputStream是所有字节输出流的父类。

5、Reader是字符输入流的父类,Writer是字符输出流的父类。

第一步:创建对象
    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("D:\\io\\b.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();
​
​
字符输出流
第一步:创建对象
                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()                 释放资源/关流
          代码演示:
        FileWriter fw = new FileWriter("D:\\io\\a.txt",true);
        char[] chars = {'a','b','c','我'};
        fw.write(chars);
        fw.close();

字符流的特点

//会把文件中的数据放到缓冲区当中
缓冲区大小为8192个字节 16k
FileReader fr = new FileReader("myio\\b.txt");
        fr.read();//会把文件中的数据放到缓冲区当中
​
        //清空文件
        FileWriter fw = new FileWriter("myio\\b.txt");
​
        //请问,如果我再次使用fr进行读取
        //会读取到数据吗?
​
        //会把缓冲区中的数据全部读取完毕
​
        //正确答案:
        //但是只能读取缓冲区中的数据,文件中剩余的数据无法再次读取
        int ch;
        while((ch = fr.read()) != -1){
            System.out.println((char)ch);
        }
        fw.close();
        fr.close();
  • 26
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

皎月当空照我素心

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

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

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

打赏作者

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

抵扣说明:

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

余额充值