• 3、IO流之字节流和字符流


    1、IO流是做什么的?

    2、IO的分类:

           按流向分:可以分成读和写
           
          
           按类型分,可分为字符流和字节流
    
    • 1
    • 2
    • 3
    • 4

    3、IO流的体系结构:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jy0MFc2q-1659543003407)(https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/bf40da15d11b4e43a6cc406bc7394e9c~tplv-k3u1fbpfcp-watermark.image?)]

    4、字节流写出数据:FileOutputStream

     //1、创建字节输出流对象
    FileOutputStream fileOutputStream=new FileOutputStream("a.txt");
    
    //2、写出数据
    fileOutputStream.write(97);
    fileOutputStream.write(98);
    fileOutputStream.write(99);
    
    fileOutputStream.write("罗兆你要自强".getBytes(StandardCharsets.UTF_8));
    
    //3、关闭流,释放资源。
    fileOutputStream.close();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WEcd2Ksj-1659543003408)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/155008c0fd344a1ba19e748da09892a9~tplv-k3u1fbpfcp-watermark.image?)]

    4.1、FileOutputStream的构造方法

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f3lJleZk-1659543003408)(https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/906072a373ee4182b1b53b9ec8f8528f~tplv-k3u1fbpfcp-watermark.image?)]

    4.2 FileOutputStream的成员方法

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lcHBxgTb-1659543003409)(https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/3c9ec3963adf4220bbdae9d4052982ef~tplv-k3u1fbpfcp-watermark.image?)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DiUnrO6F-1659543003409)(https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/78666df5ca7a42469f8527b43e503280~tplv-k3u1fbpfcp-watermark.image?)]

    4.3 字节流写时候-换行操作

    window:系统下 \r\n、\r、\n 3种方式(推荐使用\r\n,因为另外2种换行符可能不适用于Win7、Win8)

    mac:\r

    linux:\n

    5、字节输入流(读取)FileInputStream

    5.1 一次读取一个字节

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r9kLdch6-1659543003410)(https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/304a5de4145a44a1b8bc7c993acb6db1~tplv-k3u1fbpfcp-watermark.image?)]

    5.2 构造方法

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Tn76gb14-1659543003410)(https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/bfadb3e8a4564eb3907cf4015b39ff18~tplv-k3u1fbpfcp-watermark.image?)]

    5.3 返回-1说明读取到行尾了,所以只要返回的不是-1就可以继续读。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Lpq6TPHZ-1659543003410)(https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/f59f75469f024ba78da47522215da434~tplv-k3u1fbpfcp-watermark.image?)]

    5.4 字节流循环读取

      FileInputStream fis=new FileInputStream("a.txt");
        int i;
    while ((i=fis.read())!=-1){
        System.out.println(i);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bqfQ9A3K-1659543003411)(https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/1476aeb434b1476aa33dd09b4b372496~tplv-k3u1fbpfcp-watermark.image?)]

    5.5 数组拷贝 读取-写出

      FileInputStream fis=new FileInputStream("D:\learing\test.mp4");
    
      FileOutputStream fos=new FileOutputStream("test2.mp4");
    
      byte[] bys=new byte[1024];
    
      int len;
    
      while ((len=fis.read(bys))!=-1){
        fos.write(bys,0,len);
    }
    
      fis.close();
      fos.close();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    5.6 根据数组的长度,决定一次读取多少字节,并把读取到数据存到数组中。

    5.6.1

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2kvYRGDh-1659543003411)(https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d7039304b8b94cc4b83dd556e6b63647~tplv-k3u1fbpfcp-watermark.image?)]

    FileInputStream fis=new FileInputStream("a.txt");
    byte[] bys=new byte[3];
    int read = fis.read(bys);
    System.out.println(read);
    System.out.println(Arrays.toString(bys));
    
    • 1
    • 2
    • 3
    • 4
    • 5

    5.6.2

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nz3nTrvv-1659543003411)(https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/95814b5b066e4fb3b01fb88a272e3064~tplv-k3u1fbpfcp-watermark.image?)]

      FileInputStream fis=new FileInputStream("a.txt");
      byte[] bys=new byte[3];
    int len;//记录读取数据的位置
    while ((len= fis.read(bys))!=-1){
        String str=new String(bys,0,len);
        System.out.println(str);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    6、字符流

    字符流=字节流+编码表

    当我们调用read 方法 读取字符的时候
    实际上,底层会先读取到(一个字节)
    判断这个字节是否为负数(中文字符,字节的第一个,肯定是负数)

    你:-74 -73 -72

    第一次读取到的是-74,就可以判断,读取的内容是中文了

    是中文的话,再结合平台默认编码表,决定继续读取多少字节

    UTF-8,读取3个字节—>转换为中文的汉子

    如果读取到的字节,是正数,就直接读取一个字节,然后转换。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v5F7f6P7-1659543003412)(https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/3d565c27297640698dfb9acf53f54ebd~tplv-k3u1fbpfcp-watermark.image?)]

    6.1 拷贝一个大文本文件

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3AS0nMRp-1659543003412)(https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/23a1911a3aba4959ab0e5cd68095b133~tplv-k3u1fbpfcp-watermark.image?)]

    7、字节流和字符流的区别

    7.1、创建的数组类型不一样
    7.2 字节流写出的数据,就算没有关闭流,数据也会写出。字符流不会。
    7.3 字符流写出数据可以直接写出字符串。
    7.4 字符流只有调了close关闭流后,或者flush 才会把缓冲区刷出。
    flush把数据从缓冲区刷到文件中后,还可以继续进行刷出。
    但是close后,就不能再进行写出了。

    以上内容,来自我稀土掘金博客。
    链接: 稀土掘金

  • 相关阅读:
    TCL基础学习 -输出 赋值 替换和数学表达
    智慧社区解决方案的服务形式有哪些
    HTTP 协议概述
    最新版的Python写春联,支持行书隶书楷书,不再有缺失汉字
    C++ 虚函数表
    Numpy基础教程
    【FLASH存储器系列十】ONFI数据接口的时序参数与时序图
    java反射机制详解
    windows远程连接服务器并映射端口访问目标服务
    Linux——生产者消费者模型
  • 原文地址:https://blog.csdn.net/helpluozhao123/article/details/126151269