探究Java的磁盘写入神器:OutputStream详解

2023年 10月 16日 44.7k 0

  咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java之IO流啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~

在这里插入图片描述

🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!

环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8


前言

  在Java开发中,我们往往需要将程序中生成的数据或者结果保存在磁盘文件中,这时我们就需要使用到Java的输入输出流。

  在输入输出流中,OutputStream是Java中最为常用的输出流,它能够将数据流输出到目标设备中,例如磁盘文件、网络等。

  本文将对Java中的OutputStream进行详细介绍,包括它的作用、使用方法、源代码等内容,帮助读者更好地掌握这一重要的输出流。

摘要

  本文主要介绍了Java中的OutputStream,包括它的作用、使用方法、源代码等内容。具体而言,本文将从以下几个方面进行介绍:

  • OutputStream的概述和作用;
  • OutputStream的使用方法,包括如何创建OutputStream对象、如何使用OutputStream输出数据、如何关闭OutputStream
  • OutputStream的源代码分析;
  • 演示代码和测试用例;
  • 小结和总结。
  • OutputStream

    概述和作用

      OutputStream是Java中的一个抽象类,它是所有输出流的父类,用于写入数据流到目标设备中。OutputStream提供了一系列的方法,可以用于输出不同类型的数据到目标设备中。

    OutputStream的主要作用包括:

  • 写入二进制数据:OutputStream可以将二进制数据流写入到目标设备中,例如将图片、视频等二进制文件写入到磁盘文件中;
  • 写入字符数据:OutputStream可以将字符数据流写入到目标设备中,例如将字符串写入到文本文件中;
  • 写入网络数据:OutputStream可以将网络数据流写入到目标设备中,例如将数据发送给服务器。
  • 使用方法

    创建OutputStream对象

      在Java中,OutputStream是一个抽象类,不能直接被实例化。因此,我们需要使用其子类来创建OutputStream对象。

      常用的OutputStream子类有FileOutputStreamByteArrayOutputStreamDataOutputStream等。下面以FileOutputStream为例,介绍如何创建OutputStream对象:

    FileOutputStream outputStream = new FileOutputStream("./template/hello.txt");
    

      上述代码创建了一个名为./template/hello.txt的文件输出流,它将数据流写入到磁盘文件中。

    使用OutputStream输出数据

      OutputStream提供了一系列方法,可以用于输出不同类型的数据到目标设备中。例如,可以使用write()方法将字节数组写入到磁盘文件中:

    byte[] data = "Hello, OutputStream!".getBytes();
    outputStream.write(data);
    

      除了write()方法,OutputStream还提供了很多其他方法,可以用于输出不同类型的数据。例如,write(byte[] b, int off, int len)方法可以将字节数组部分内容写入到磁盘文件中。

    关闭OutputStream

      在使用OutputStream写入数据时,为了保证数据的完整性和可靠性,需要及时关闭OutputStream。可以使用close()方法关闭输出流对象:

    outputStream.close();
    

    源代码分析

    在Java中,OutputStream是一个抽象类,包路径为:java.io.OutputStream

    其源代码如下:

    public abstract class OutputStream implements Closeable, Flushable {
        //...
        public abstract void write(int b) throws IOException;
        public void write(byte[] b) throws IOException {
            write(b, 0, b.length);
        }
        public void write(byte[] b, int off, int len) throws IOException {
            if ((off  b.length) || (len  b.length) || ((off + len) < 0)) {
                throw new IndexOutOfBoundsException();
            } else if (len == 0) {
                return;
            }
            for (int i = 0 ; i < len ; i++) {
                write(b[off + i]);
            }
        }
        //...
    }
    

      OutputStream 中有三个抽象方法未实现,write(int b)flush()close(),同时它还实现了 write(byte[] b)write(byte[] b, int off, int len) 这两个方法。

    • write(int b) 方法是用来向输出流中写入单个字节(b 的低 8 位)。它是一个抽象方法,需要被子类实现。

    • write(byte[] b) 方法是将 byte 数组 b 的所有字节写入到输出流中。它调用了 write(byte[] b, int off, int len) 方法,这个方法是将 byte 数组 b 中从偏移量 off 开始的 len 个字节写入输出流中。在实现这个方法的时候,它遍历了 byte 数组中的所有字节,并调用了 write(int b) 方法将每个字节写入输出流中。

    • flush() 方法用来将缓冲区中的数据写出到输出流中,这个方法是一个空实现方法,具体实现需要由子类实现。

    • close() 方法用来关闭输出流并释放与之相关的资源。这个方法同样是一个空实现方法,具体实现需要由子类实现。

    其源码部分截图如下所示:

    在这里插入图片描述

      总之,OutputStream 是所有输出流的基类,它定义了输出流的基本特性,并提供了一些常用的方法,如写入单个字节、写入字节数组等。任何继承自 OutputStream 的子类都需要实现它的抽象方法,以便正确地实现其功能。

    测试用例

    以下是一个简单的示例代码,演示了如何使用OutputStream将字符串写入到磁盘文件中:

    测试用例代码

    package com.example.javase.io.outputStream;
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    
    /**
     * @Author bug菌
     * @Date 2023-10-15 19:13
     */
    public class OutputStreamTest {
    
        public static void main(String[] args) throws IOException {
            String str = "Hello, jym!";
            byte[] data = str.getBytes();
            OutputStream outputStream = null;
    
            try {
                outputStream = new FileOutputStream("./template/hello.txt");
                outputStream.write(data);
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (outputStream != null) {
                    outputStream.close();
                }
            }
        }
    }
    

    测试代码解析

      这是一个使用Java的输出流(OutputStream)将字符串输出到本地文件的例子。具体解析如下:

  • 定义字符串
  • String str = "Hello, jym!";
    
  • 将字符串转换为字节数组
  • byte[] data = str.getBytes();
    
  • 创建输出流对象
  • OutputStream outputStream = null;
    try {
        outputStream = new FileOutputStream("./template/hello.txt");
    } catch (IOException e) {
        e.printStackTrace();
    }
    

      这里使用了Java的文件输出流(FileOutputStream),将数据输出到本地文件。./template/hello.txt表示本地文件的路径,如果文件不存在则会创建文件。如果创建失败则会抛出IOException。

  • 写入数据
  • outputStream.write(data);
    

      将字节数组写入输出流中。

  • 关闭流
  • if (outputStream != null) {
        outputStream.close();
    }
    

      为了防止资源泄漏,需要在使用完输出流后关闭它。这里使用了Java的异常处理机制,在代码中使用try-catch-finally语句块。

    测试结果

    根据测试用例执行结果如下:

    在这里插入图片描述

    小结

      本文详细介绍了Java中的OutputStream,包括它的作用、使用方法、源代码等内容。具体而言,本文介绍了OutputStream的概述和作用,以及如何创建OutputStream对象、使用OutputStream输出数据和关闭OutputStream等内容。

      同时,本文还给出了一个简单的演示代码和测试用例,帮助读者更好地掌握OutputStream的使用。

    总结

      OutputStream是Java中最常用的输出流之一,它能够将数据流输出到目标设备中,例如磁盘文件、网络等。在使用OutputStream时,需要注意及时关闭输出流对象,避免数据的丢失或不完整。当需要将程序中生成的数据或结果输出到磁盘文件中时,可以使用OutputStream来完成。

    ... ...

      ok,以上就是我这期的全部内容啦,如果还想学习更多,你可以看看如下的往期热文推荐哦,每天积累一个奇淫小知识,日积月累下去,你一定能成为令人敬仰的大佬。

    「赠人玫瑰,手留余香」,咱们下期拜拜~~

    附录源码

      如上涉及所有源码均已上传同步在「Gitee」,提供给同学们一对一参考学习,辅助你更迅速的掌握。

    ☀️建议/推荐你

      无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学Java」,bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门Java编程,就像滚雪球一样,越滚越大,指数级提升。

      最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。

      同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。

    📣关于我

    我是bug菌,CSDN | 掘金 | InfoQ | 51CTO 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,华为云 | 阿里云| 腾讯云等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论