IO流之 字节流 & 字符流

本文涉及的产品
数据传输服务 DTS,数据迁移 small 3个月
推荐场景:
MySQL数据库上云
简介: 大多数应用程序都需要实现与设备之间的数据传输,例如键盘可以输入数据,显示器可以显示程序的运行结果等。在Java中,将这种通过不同输入输出设备(键盘,内存,显示器,网络等)之间的数据传输抽象的表述为“流”,程序允许通过流的方式与输入输出设备进行数据传输。Java中的“流”都位于Java.io包中,称之为IO(输入输出)流。IO流即InputOutput的缩写。一切文件数据在存储时,都是以二进制数字的形式保存,都一个一个的字节,那么传输时一样如此。所以,字节流可以传输任意文件数据。httpshttps。...

目录

前言

一、了解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流

image.gif

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();
            }
        }

    image.gif

    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);
                }
            }
        }

    image.gif

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

    image.gif

    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();
            }
        }

    image.gif

    三、字符流

    1.什么是字符流

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

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

    image.gif

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

           image.gif

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

    但性能较慢

    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);
            }
        }

    image.gif

    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);
            }
        }

    image.gif

    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();
        }

    image.gif


    总结

      1. 字节流适合做一切文件数据拷贝
      2. 字节流不适合读取中文内容输出
      3. 字符流适合做文本文件的操作(读、写)
      相关实践学习
      RocketMQ一站式入门使用
      从源码编译、部署broker、部署namesrv,使用java客户端首发消息等一站式入门RocketMQ。
      Sqoop 企业级大数据迁移方案实战
      Sqoop是一个用于在Hadoop和关系数据库服务器之间传输数据的工具。它用于从关系数据库(如MySQL,Oracle)导入数据到Hadoop HDFS,并从Hadoop文件系统导出到关系数据库。 本课程主要讲解了Sqoop的设计思想及原理、部署安装及配置、详细具体的使用方法技巧与实操案例、企业级任务管理等。结合日常工作实践,培养解决实际问题的能力。本课程由黑马程序员提供。
      目录
      相关文章
      |
      4月前
      |
      存储 Java 数据安全/隐私保护
      从零开始学习 Java:简单易懂的入门指南之IO字符流(三十一)
      从零开始学习 Java:简单易懂的入门指南之IO字符流(三十一)
      |
      4月前
      |
      存储 移动开发 Java
      从零开始学习 Java:简单易懂的入门指南之IO字节流(三十)
      从零开始学习 Java:简单易懂的入门指南之IO字节流(三十)
      |
      16天前
      |
      存储 缓存 Java
      【Java IO系列】那字节流和字符流有什么区别?
      而如果使用缓存流,一次性从文件里读取多个字节到缓存中,可以减少系统调用同时也减少了磁盘读取,提高了读取的效率。所以字符流是一个很方便的流了,没有必要把一个方便的流转换成一个不方便的流。,涉及到用户空间和内核空间之间的上下文切换,这些切换是很昂贵的。从输入流读取下一个数据字节,值字节以0到255范围内的。好的面试官,Java IO有两个参与对象,一个是。,这个基类提供了3个方法可以来读取字节流。,同样是提供了3个方法来支持字符流读取。好的,有这些不同之处,主要是3个方面。是这样的,虽然字节流比字符流的。
      18 0
      【Java IO系列】那字节流和字符流有什么区别?
      |
      4月前
      |
      缓存 Java
      IO流【Java中IO的四大抽象类、常用流详解 、 缓冲字节流、 文件字符流、缓冲字符流】(二)-全面详解(学习总结---从入门到深化)
      IO流【Java中IO的四大抽象类、常用流详解 、 缓冲字节流、 文件字符流、缓冲字符流】(二)-全面详解(学习总结---从入门到深化)
      38 0
      IO流【Java中IO的四大抽象类、常用流详解 、 缓冲字节流、 文件字符流、缓冲字符流】(二)-全面详解(学习总结---从入门到深化)
      |
      5月前
      |
      移动开发 Java Linux
      【IO】JavaIO流:字节流、字符流、缓冲流、转换流、序列化流等
      【IO】JavaIO流:字节流、字符流、缓冲流、转换流、序列化流等
      35 0
      |
      5月前
      |
      Java
      IO流Java字节流和字符流的区别是什么?
      IO流Java字节流和字符流的区别是什么?
      35 0
      |
      6月前
      |
      存储 移动开发 Java
      [java进阶]——IO流基本字节流和字符流,字符流中的缓冲流,递归实现多级文件拷贝
      [java进阶]——IO流基本字节流和字符流,字符流中的缓冲流,递归实现多级文件拷贝
      |
      23天前
      |
      存储 缓存 安全
      Java 中 IO 流、File文件
      Java 中 IO 流、File文件
      |
      6天前
      |
      Java Unix Windows
      |
      2天前
      |
      存储 Java Linux
      【Java EE】 文件IO的使用以及流操作
      【Java EE】 文件IO的使用以及流操作