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数据库
      开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
      Sqoop 企业级大数据迁移方案实战
      Sqoop是一个用于在Hadoop和关系数据库服务器之间传输数据的工具。它用于从关系数据库(如MySQL,Oracle)导入数据到Hadoop HDFS,并从Hadoop文件系统导出到关系数据库。 本课程主要讲解了Sqoop的设计思想及原理、部署安装及配置、详细具体的使用方法技巧与实操案例、企业级任务管理等。结合日常工作实践,培养解决实际问题的能力。本课程由黑马程序员提供。
      目录
      相关文章
      |
      1月前
      |
      Java 数据处理 开发者
      揭秘Java IO流:字节流与字符流的神秘面纱!
      揭秘Java IO流:字节流与字符流的神秘面纱!
      35 1
      |
      1月前
      |
      自然语言处理 Java 数据处理
      Java IO流全解析:字节流和字符流的区别与联系!
      Java IO流全解析:字节流和字符流的区别与联系!
      74 1
      |
      2月前
      |
      移动开发 Java Linux
      IO流:字节流
      在Java编程中,IO流是一个核心概念,用于与文件、网络、内存等数据源交互。Java的IO库提供丰富的类和方法支持数据读写。IO流分为字节流和字符流,前者可操作所有类型文件,后者仅限纯文本文件。`FileOutputStream`用于向文件写入字节,支持多种写入方式,并可通过构造函数的布尔参数控制是否追加写入。`FileInputStream`则用于从文件读取字节,支持逐字节或批量读取。文件拷贝可通过结合读写操作实现,高效的方法是一次性读取并写入大容量数组。处理IO流时需注意异常管理,合理使用try-catch-finally结构确保资源正确释放。JDK7及以后版本提供了自动关闭资源的简化语法
      50 10
      |
      3月前
      |
      存储 缓存 Java
      15 Java IO流(File类+IO流+字节流+字符流+字节编码)
      15 Java IO流(File类+IO流+字节流+字符流+字节编码)
      53 3
      |
      4月前
      |
      存储 缓存 Java
      JavaSE—IO流之字符流与字节流
      JavaSE—IO流之字符流与字节流
      |
      5月前
      |
      存储 自然语言处理 Java
      Java IO流完全手册:字节流和字符流的常见应用场景分析!
      【6月更文挑战第26天】Java IO流涵盖字节流和字符流,字节流用于二进制文件读写及网络通信,如图片和音频处理;字符流适用于文本文件操作,支持多语言编码,确保文本正确性。在处理数据时,根据内容类型选择合适的流至关重要。
      72 0
      |
      5月前
      |
      自然语言处理 Java
      Java IO流进阶教程:掌握字节流和字符流的高级用法!
      【6月更文挑战第26天】Java IO流助你高效交换数据,包括字节流(InputStream/OutputStream)和字符流(Reader/Writer)的高级技巧。缓冲流(Buffered*)提升读写性能,对象流(Object*Stream)支持对象序列化。字符流的BufferedReader/BufferedWriter优化文本处理,注意字符集如UTF-8用于编码转换。掌握这些,优化IO操作,提升代码质量。
      52 0
      |
      5月前
      |
      Java 测试技术
      Java IO流深度剖析:字节流和字符流的性能对比!
      【6月更文挑战第26天】Java IO流分字节流和字符流,字节流处理所有类型数据(如图片),字符流处理文本(基于Unicode)。字节流直接处理,性能高,适合非文本文件;字符流处理文本时考虑编码,适合文本文件。性能测试显示,字节流在读写非文本文件时更快,而字符流在处理文本时更方便。选择流类型应依据数据类型和需求。
      67 0
      |
      3月前
      |
      存储 Java
      【IO面试题 四】、介绍一下Java的序列化与反序列化
      Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
      |
      4月前
      |
      Java 大数据
      解析Java中的NIO与传统IO的区别与应用
      解析Java中的NIO与传统IO的区别与应用