IO流学习总结(下)---字符流

字符流:顾名思义就以字符的形式读写文件的 单位是char 其实内部也是通过字节二进制来操作的 只是它内部多了个编码和解码的功能 比如write一个字符的时候Java虚拟机会自动编码 reader的时候又会自动解码

重点:操作是以字符为单位
记住字符流和字节流的唯一区别就是一个是对char进行操作 一个对字节进行操作
返回的其实都是int类型

首先看一下写入:
Reader
直接来看代码:

//使用缓冲字符数组读取文件。
    public static void readTest2() throws IOException{
        //找到目标文件
        File file = new File("F:\\1208project\\day21\\src\\day21\\Demo1.java");
        // 建立数据的输入通道
        FileReader fileReader = new FileReader(file);
        //建立缓冲字符数组读取文件数据
        char[] buf = new char[1024];
        int length = 0 ; 
        while((length = fileReader.read(buf))!=-1){
            System.out.print(new String(buf,0,length));
        }
    }
public static void readTest1() throws IOException{
        //找到目标文件
        File file = new File("F:\\1208project\\day21\\src\\day21\\Demo1.java");
        //建立数据的输入通道
        FileReader fileReader = new FileReader(file);
        int content = 0 ;
        while((content = fileReader.read())!=-1){ //每次只会读取一个字符,效率低。
            System.out.print((char)content);
        }
        //关闭资源
        fileReader.close();
    }

Wirte: 关键 内部维护了一个缓冲数组 这是字节流和字符流中唯一自带缓冲组的

public static void  writeTest1() throws IOException{
        //找到目标文件
        File file = new File("F:\\a.txt");
        //建立数据输出通道
        FileWriter fileWriter = new FileWriter(file,true);   //追加
        //准备数据,把数据写出
        String data = "今天天气非常好!!";
        fileWriter.write(data);  //字符流具备解码的功能。
        //刷新字符流
//      fileWriter.flush();
        //关闭资源
        fileWriter.close(); //

也可以不用flush 因为close中包括了flush

FileWriter要注意的事项:
1. 使用FileWriter写数据的时候,FileWriter内部是维护了一个1024个字符数组的,写数据的时候会先写入到它内部维护的字符数组中,如果需要把数据真正写到硬盘上,需要调用flush或者是close方法或者是填满了内部的字符数组。
2. 使用FileWriter的时候,如果目标文件不存在,那么会自动创建目标文件。
3.使用FileWriter的时候, 如果目标文件已经存在了,那么默认情况会先情况文件中的数据,然后再写入数据 , 如果需要在原来的基础上追加数据,需要使用“new FileWriter(File , boolean)”的构造方法,第二参数为true

何时使用字符流,何时使用字节流?依据是什么?

使用字符流的应用场景: 如果是读写字符数据的时候则使用字符流。

使用字节流的应用场景: 如果读写的数据都不需要转换成字符的时候,则使用字节流。

总结:
1. 字符流的输出流write内部维护了一个数组 char 1024字符
2. 字符流的输入流read是一个一个读取的 返回int 用char接受
3. 字符流输出时候要用flush或者close 因为内部的数组还在内存中 只有推一下才会存入硬盘中 不像字节流的write不需要推入因为它是直接写入硬盘的
4. 用字符流拷贝图片会出问题 因为 他会找对应的GBK码 如果没找到二进制对应的那个值 就会返回一个值(一个字符) 这样子 图片大小会变小而且损坏
5. 用字节流读取txt文件的时候 如果开的byte太小 那么比如刚好读到一个汉字有2个字节结果只能存储一个字节 那么就会乱码 所以注意 数据要转化字符的话 一定要用字符流来操作
6. 字节流的输入不喜欢用缓冲 不如直接创造一个缓冲数组
7. 而字符流的输入喜欢用缓冲 因为扩展了fileReader的功能 内部还缓冲了一个char数组 接下来会讨论缓冲流 比如 readLine 一次读一行 返回的是string 到末尾返回null

注意:
String name=”今11天天\r\n气真好”;
fileWriter.write(name);
这样子txt文本中才会换行

字符流先将文件用各种形式的编码方式转换成字节数组,然后通过 ‘流’ 传输到目的地,再用同种编码方式将字节数组转换成文件形式”(所以说字符流的最底层原理是字节流,只是字符流相对于传输字符串来说代码比较简单,它把“文字转换成字节数组,字节数组转换成文字”这段步骤包装起来了而已)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值