IO流之 字节流 & 字符流

目录

前言

一、了解IO流

1.IO流的特点

2.流的三种分类方式

3.流的层次结构

二、字节流

1.什么是字节流

2.使用字节流实现文件拷贝

3.使用try - catch - finally 优化资源释放

4.使用try - catch - resource 进一步优化资源释放

三、字符流

1.什么是字符流

2.文件字符输入流 - 每次读取单个字符

3. 文件字符输入流 - 每次读取一个字符数组

 4.字符输出流

总结


前言

大多数应用程序都需要实现与设备之间的数据传输,例如键盘可以输入数据,显示器可以显示程序的运行结果等。在Java中,将这种通过不同输入输出设备(键盘,内存,显示器,网络等)之间的数据传输抽象的表述为“流”,程序允许通过流的方式与输入输出设备进行数据传输。Java中的“流”都位于Java.io包中,称之为IO(输入输出)流。 IO流:即InputOutput的缩写。


一、了解IO流

 

1.IO流的特点

IO流用来处理设备间的数据传输。

Java对数据的操作是通过流的方式。

Java用于操作流的对象都在IO包中。

流按操作数据分为两种:字节流和字符流。

流按流向分为:输入流和输出流

2.流的三种分类方式

按流的方向分为:输入流和输出流

按流的数据单位不同分为:字节流和字符流

按流的功能不同分为:节点流和处理流

3.流的层次结构

IO流的常用基类:

  • 字节流的抽象基流:InputStream和OutputStream
  • 字符流的抽象基流:Reader和Writer

二、字节流

1.什么是字节流

 一切文件数据在存储时,都是以二进制数字的形式保存,都一个一个的字节,那么传输时一样如此。所以,字节流可以传输任意文件数据。在操作流的时候,我们要时刻明确,无论使用什么样的流对象,底层传输的始终为二进制数据。

2.使用字节流实现文件拷贝

无论是音视频文件还是文本文件底层都是字节组成,因此可以使用字节输入流&字节输出流完成任何形式文件拷贝(只要保证前后文件格式、编码一致没有任何问题)

注意: 字节流不适合读取中文内容输出,(在UTF-8编码中,一个中文字符是3个字节)容易出现截断导致乱码

public static void main(String[] args)  {
        try {
            //创建字节输入流管道
            InputStream is = new FileInputStream("E:\\Pictures\\wx_camera_1654694320902.mp4");
            //创建字节输入流管道
            OutputStream os = new FileOutputStream("C:\\Users\\小茵\\Desktop\\lhy.mp4");

            //定义一个1024大小字节数组,用来转移数据
            byte[] buffer = new byte[1024];
            int len;
            while((len = is.read(buffer)) != -1){
                os.write(buffer,0,len);
            }
            System.out.println("复制完成!~~~~~");
            //关闭流
            os.close();
            is.close();

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

3.使用try - catch - finally 优化资源释放

finall代码块是最终一定会执行的,可以在在这里完成最后释放资源 

    public static void main(String[] args)  {
        InputStream is = null;
        OutputStream os = null;
        try {
            //创建字节输入流管道
            is = new FileInputStream("E:\\Pictures\\wx_camera_1654694320902.mp4");
            //创建字节输入流管道
            os = new FileOutputStream("C:\\Users\\小茵\\Desktop\\lhy.mp4");

            //定义一个1024大小字节数组,用来转移数据
            byte[] buffer = new byte[1024];
            int len;
            while((len = is.read(buffer)) != -1){
                os.write(buffer,0,len);
            }
            System.out.println("复制完成!~~~~~");


        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            //无论代码正常结束还是出现异常都要执行这里
            try {
                //先判断非空,然后关闭流
                if (os != null)os.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            try {
                if (is != null)is.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }

 

4.使用try - catch - resource 进一步优化资源释放

 

    public static void main(String[] args)  {
        try (
                //此处只能放置资源对象,使用完毕后即使出现异常也会自动调用资源对象的close方法关闭资源
                //创建字节输入流管道
                InputStream is = new FileInputStream("E:\\Pictures\\wx_camera_1654694320902.mp4");
                //创建字节输入流管道
                OutputStream os = new FileOutputStream("C:\\Users\\小茵\\Desktop\\lhy.mp4");
                ){
            //定义一个1024大小字节数组,用来转移数据
            byte[] buffer = new byte[1024];
            int len;
            while((len = is.read(buffer)) != -1){
                os.write(buffer,0,len);
            }
            System.out.println("复制完成!~~~~~");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

 

三、字符流

1.什么是字符流

由于字节流读取中文有可能会应截断导致乱码,所以,java就提供了转换流。字符流=字节流+编码表。

编码表:由字符及其对应的数值组成的一张表

2.文件字符输入流 - 每次读取单个字符

        

读取中文字符不会出现乱码

但性能较慢 

 public static void main(String[] args) throws IOException {
        Reader fr = new FileReader("D:\\IDEA\\untitled1\\练习草稿\\Test1\\src\\data.txt");
        int code;
        while ((code = fr.read()) != -1){
            System.out.print((char) code);
        }
    }

3. 文件字符输入流 - 每次读取一个字符数组

性能相对于读取单个字符得到了提升

public static void main(String[] args) throws IOException {
        Reader fr = new FileReader("D:\\IDEA\\untitled1\\练习草稿\\Test1\\src\\data.txt");
        char[] buffer = new char[1024];
        int len;
        while ((len = fr.read(buffer)) != -1){
            String rs = new String(buffer,0,len);
            System.out.print(rs);
        }
    }

 4.字符输出流

public static void main(String[] args) throws IOException {
        //创建字符输出流管道与目标文件接通
        Writer fw = new FileWriter("D:\\IDEA\\untitled1\\练习草稿\\Test1\\src\\data.txt");
        //写一个字符出去
        fw.write(1);
        fw.write('a');
        fw.write('哈');
        //写一个字符串出去
        fw.write("哈哈哈哈哈");
        //写一个字符数组出去
        char[] chars = "abcdef".toCharArray();
        fw.write(chars);
        //只写一部分字符数组、字符串
        fw.write(chars,0,3);
        fw.write("哈哈哈哈哈",0,3);
        //关闭
        fw.close();
    }

总结

  1. 字节流适合做一切文件数据拷贝
  2. 字节流不适合读取中文内容输出
  3. 字符流适合做文本文件的操作(读、写)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

爱吃香蕉的阿豪

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

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

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

打赏作者

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

抵扣说明:

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

余额充值