IO流之 字节流 & 字符流

本文涉及的产品
数据传输服务 DTS,数据同步 small 3个月
推荐场景:
数据库上云
数据传输服务 DTS,数据迁移 small 3个月
推荐场景:
MySQL数据库上云
数据传输服务 DTS,数据同步 1个月
简介: 大多数应用程序都需要实现与设备之间的数据传输,例如键盘可以输入数据,显示器可以显示程序的运行结果等。在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. 字符流适合做文本文件的操作(读、写)
      相关实践学习
      MySQL数据库DTS迁移上云
      利用DTS数据迁移工具完成RDS实例间的数据迁移。
      Sqoop 企业级大数据迁移方案实战
      Sqoop是一个用于在Hadoop和关系数据库服务器之间传输数据的工具。它用于从关系数据库(如MySQL,Oracle)导入数据到Hadoop HDFS,并从Hadoop文件系统导出到关系数据库。 本课程主要讲解了Sqoop的设计思想及原理、部署安装及配置、详细具体的使用方法技巧与实操案例、企业级任务管理等。结合日常工作实践,培养解决实际问题的能力。本课程由黑马程序员提供。
      目录
      相关文章
      |
      19天前
      |
      Java 数据处理 开发者
      揭秘Java IO流:字节流与字符流的神秘面纱!
      【6月更文挑战第26天】Java IO流涵盖字节流和字符流,字节流处理二进制数据,如图像,由InputStream/OutputStream家族管理;字符流处理文本,基于Reader/Writer,适于文本文件。在文件复制示例中,字节流用FileInputStream/FileOutputStream,字符流用FileReader/FileWriter。选择流类型取决于数据类型和处理需求,文本文件优选字符流,二进制数据则选字节流。
      |
      14天前
      |
      存储 缓存 Java
      JavaSE—IO流之字符流与字节流
      JavaSE—IO流之字符流与字节流
      |
      19天前
      |
      存储 自然语言处理 Java
      Java IO流完全手册:字节流和字符流的常见应用场景分析!
      【6月更文挑战第26天】Java IO流涵盖字节流和字符流,字节流用于二进制文件读写及网络通信,如图片和音频处理;字符流适用于文本文件操作,支持多语言编码,确保文本正确性。在处理数据时,根据内容类型选择合适的流至关重要。
      |
      19天前
      |
      自然语言处理 Java
      Java IO流进阶教程:掌握字节流和字符流的高级用法!
      【6月更文挑战第26天】Java IO流助你高效交换数据,包括字节流(InputStream/OutputStream)和字符流(Reader/Writer)的高级技巧。缓冲流(Buffered*)提升读写性能,对象流(Object*Stream)支持对象序列化。字符流的BufferedReader/BufferedWriter优化文本处理,注意字符集如UTF-8用于编码转换。掌握这些,优化IO操作,提升代码质量。
      |
      19天前
      |
      Java 测试技术
      Java IO流深度剖析:字节流和字符流的性能对比!
      【6月更文挑战第26天】Java IO流分字节流和字符流,字节流处理所有类型数据(如图片),字符流处理文本(基于Unicode)。字节流直接处理,性能高,适合非文本文件;字符流处理文本时考虑编码,适合文本文件。性能测试显示,字节流在读写非文本文件时更快,而字符流在处理文本时更方便。选择流类型应依据数据类型和需求。
      |
      19天前
      |
      自然语言处理 Java 数据处理
      Java IO流全解析:字节流和字符流的区别与联系!
      【6月更文挑战第26天】Java IO流涵盖字节流与字符流。字节流(InputStream/OutputStream)处理数据单位为字节,适用于二进制和文本,而字符流(Reader/Writer)专注于文本,处理单位为字符,处理编码转换。字符流在字节流基础上添加编码处理,以装饰器模式实现。文件复制示例展示了两者区别:字节流直接复制所有数据,字符流处理字符编码。理解并选择适当流类型对优化程序至关重要。
      |
      2月前
      |
      存储 缓存 Java
      【Java IO系列】那字节流和字符流有什么区别?
      而如果使用缓存流,一次性从文件里读取多个字节到缓存中,可以减少系统调用同时也减少了磁盘读取,提高了读取的效率。所以字符流是一个很方便的流了,没有必要把一个方便的流转换成一个不方便的流。,涉及到用户空间和内核空间之间的上下文切换,这些切换是很昂贵的。从输入流读取下一个数据字节,值字节以0到255范围内的。好的面试官,Java IO有两个参与对象,一个是。,这个基类提供了3个方法可以来读取字节流。,同样是提供了3个方法来支持字符流读取。好的,有这些不同之处,主要是3个方面。是这样的,虽然字节流比字符流的。
      【Java IO系列】那字节流和字符流有什么区别?
      |
      6天前
      |
      Java 大数据
      解析Java中的NIO与传统IO的区别与应用
      解析Java中的NIO与传统IO的区别与应用
      |
      14天前
      |
      存储 缓存 Java
      Java零基础入门之IO流详解(二)
      Java零基础入门之IO流详解(二)
      |
      8天前
      |
      Java 大数据
      解析Java中的NIO与传统IO的区别与应用
      解析Java中的NIO与传统IO的区别与应用