码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【Java I/O 流】字节数组流:ByteArrayInputStream 和 ByteArrayOutputStream


    在这里插入图片描述

    ❤️ 个人主页:水滴技术
    🚀 支持水滴:点赞👍 + 收藏⭐ + 留言💬
    🌸 订阅专栏:Java 教程:从入门到精通

    文章目录

    • ByteArrayInputStream(字节数组输入流)
      • 内部字段
        • byte[] buf
        • int pos
        • int count
        • int mark
      • 构造函数
        • ByteArrayInputStream(byte buf[])
        • ByteArrayInputStream(byte buf[], int offset, int length)
      • 常用方法
      • 代码案例
        • 案例一:通过字节数组创建实例
        • 案例二:通过字节数组和偏移量创建实例
    • ByteArrayOutputStream(字节数组输出流)
      • 内部字段
        • byte[] buf
        • int count
      • 构造函数
        • ByteArrayOutputStream()
        • ByteArrayOutputStream(int size)
      • 常用方法
        • void writeTo(OutputStream out)
        • byte[] toByteArray()
        • String toString()
        • String toString(String charsetName)
      • 代码案例
        • 案例一:创建一个字节数组输出流,缓冲区大小默认32
        • 案例二:创建一个字节数组输出流,缓冲区大小指定
    • 系列文章
    • 热门专栏


    大家好,我是水滴~~

    今天的主题是字节数组流,即ByteArrayInputStream 和 ByteArrayOutputStream。这两个流主要用于字节数组与流之前的转换。

    本文将通过“内部字段、构造函数、常用方法、代码案例”的方式来介绍这两个类,赶紧开始吧。

    ByteArrayInputStream(字节数组输入流)

    ByteArrayInputStream 会在内存中创建一个字节数组缓冲区,从流中读取的字节会保存在该缓冲区中,内部计数器跟踪读取方法提供的下一个字节。

    内部字段

    byte[] buf

    由流的创建者提供的字节数组。

    int pos

    要从输入流缓冲区中读取的下一个字节的索引。

    int count

    流中缓冲区的有效字节数。

    int mark

    流中当前标记的位置。

    构造函数

    创建该字节数组输入流有两种方式。

    ByteArrayInputStream(byte buf[])

    通过字节数组 buf 创建一个 ByteArrayInputStream 实例,该字节数组不会被复制,而是直接作为它的缓冲区数组。pos 的初始值为0,count 的初始值为 buf 的长度。

    ByteArrayInputStream(byte buf[], int offset, int length)

    通过字节数组 buf 创建一个 ByteArrayInputStream 实例,使用 buf 作为缓冲区数组。pos 的初始值为offset,count 的初始值为 “offset + length ”和 “buf.length” 的最小值。而 mark初始值为 offset。

    常用方法

    该类的常用方法与前面介绍的 InputStream 和 FileInputStream 的方法一样,可以参考《字节输入输出流:InputStream & OutputStream》和《文件字节输入输出流:FileInputStream & FileOutputStream》,这里就不再赘述。

    代码案例

    该代码案例重点介绍如何将字节数组转为流的,流的读取等操作与InputStream 和 FileInputStream 相同,不是本文的重点。

    案例一:通过字节数组创建实例

    代码示例:

    public static void read1() throws IOException {
        // 创建一个字节数组。
        byte[] bytes = {97, 98, 99, 100, 101};
        // 将字节数组转为流 ByteArrayInputStream
        ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
    
        // 循环判断可读取字节数
        while (bais.available() > 0) {
            // 读取一个字节
            System.out.println((char) bais.read());
        }
    
        // 关闭流并释放资源
        bais.close();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    输出内容:

    a
    b
    c
    d
    e
    
    • 1
    • 2
    • 3
    • 4
    • 5

    案例二:通过字节数组和偏移量创建实例

    代码示例:

    public static void read2() throws IOException {
        // 创建一个字节数组。
        byte[] bytes = {97, 98, 99, 100, 101};
        // 将字节数组转为流 ByteArrayInputStream
        ByteArrayInputStream bais = new ByteArrayInputStream(bytes, 0, 3);
    
        // 循环判断可读取字节数
        while (bais.available() > 0) {
            // 读取一个字节
            System.out.println((char) bais.read());
        }
    
        // 关闭流并释放资源
        bais.close();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    输出内容:

    a
    b
    c
    
    • 1
    • 2
    • 3

    ByteArrayOutputStream(字节数组输出流)

    ByteArrayOutputStream 类会在内部创建一个字节数组缓冲区,所有写入输出流的数据会被保存到该缓冲区中。当数据写入缓冲区时,缓冲区的长度会自动增长,可以使用 toByteArray() 和 toString() 来检索缓冲区中的数据。

    内部字段

    byte[] buf

    存储数据的内部缓冲区数组。

    int count

    缓冲区中的有效字节数。

    构造函数

    创建该字节数组输出流有两种方式。

    ByteArrayOutputStream()

    创建一个 ByteArrayOutputStream 实例,并创建一个内部缓冲区,大小使用默认值32。

    ByteArrayOutputStream(int size)

    创建一个 ByteArrayOutputStream 实例,并创建一个内部缓冲区,大小使用指定的 size。

    常用方法

    该类的常用方法与前面介绍的 OutputStream 和 FileOutputStream 的方法基本相同,可以参考《字节输入输出流:InputStream & OutputStream》和《文件字节输入输出流:FileInputStream & FileOutputStream》。

    这里主要列举一些不同的方法,主要有:

    void writeTo(OutputStream out)

    该当前输出流中的缓冲数据全部写入到另一个指定的输出流中。

    byte[] toByteArray()

    创建一个新的字节数组。它的大小与缓冲区大小相同,并且缓冲区的有效内容也复制到其中。

    String toString()

    将缓冲区中的字节转换为字符串,使用默认的字符集。

    String toString(String charsetName)

    将缓冲区中的字节转换为字符串,使用指定的字符集。

    代码案例

    该代码案例重点介绍如何将流转为字节数组的,流的写入等操作与OutputStream 和 FileOutputStream 相同,不是本文的重点。

    案例一:创建一个字节数组输出流,缓冲区大小默认32

    代码示例:

    public static void write1() throws IOException {
        // 创建一个字节数组。
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
    
        // 写入一个字节
        baos.write(97);
        // 写入一个字节
        baos.write(98);
        // 写入一个字节
        baos.write(99);
        // 写入一个字节
        baos.write(100);
        // 写入一个字节
        baos.write(101);
    
        // 获取输出流中的字节,并打印至控制台
        byte[] bytes = baos.toByteArray();
        System.out.println(new String(bytes));
    
        // 关闭流并释放资源
        baos.close();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    输出内容:

    abcde
    
    • 1

    案例二:创建一个字节数组输出流,缓冲区大小指定

    代码示例:

    public static void write2() throws IOException {
        // 创建一个字节数组。
        ByteArrayOutputStream baos = new ByteArrayOutputStream(3);
    
        // 写入一个字节
        baos.write(97);
        // 写入一个字节
        baos.write(98);
        // 写入一个字节
        baos.write(99);
        // 写入一个字节
        baos.write(100);
        // 写入一个字节
        baos.write(101);
    
        // 将缓冲区中的字节转为字符串,并打印至控制台
        System.out.println(baos.toString());
    
        // 关闭流并释放资源
        baos.close();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    输出内容:

    abcde
    
    • 1

    系列文章

    🔥 【Java I/O 流】文件的操作——java.io.File 类详解

    🔥 【Java I/O 流】I/O 流的原理与流的分类

    🔥 【Java I/O 流】字节输入输出流:InputStream & OutputStream

    🔥 【Java I/O 流】文件字节输入输出流:FileInputStream & FileOutputStream(文件读写案例)

    🔥 【Java I/O 流】字符输入输出流:Reader 和 Writer

    🔥 【Java I/O 流】文件字符输入输出流:FileReader 和 FileWriter

    🔥 【Java I/O 流】字节缓冲流:BufferedInputStream 和 BufferedOutputStream

    🔥 【Java I/O 流】字符缓冲流:BuffreadReader 和 BufferedWriter

    热门专栏

    👍 《IDEA 教程:从入门到精通》

    👍 《Java 教程:从入门到精通》

    👍 《MySQL 教程:从入门到精通》

    在这里插入图片描述

  • 相关阅读:
    流媒体分析之rtmp协议srs服务器数据收发
    c++图论
    工业交换机选用技巧
    【VuePress2.0】快速开始(不用)
    (附源码)springboot大学医学生毕业实习分配系统 毕业设计 212002
    在ios系统上实现更改IP地址
    C语言Free空指针会怎样?
    背包九讲(部分)
    洛谷P1024 [NOIP2001 提高组] 一元三次方程求解(优雅的暴力+二分,干净利落)
    一文了解如何获取GPT4账号及AI绘图应用
  • 原文地址:https://blog.csdn.net/weixin_67276852/article/details/126085576
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号