(每日持续更新)jdk api之ByteArrayOutputStream基础、应用、实战

博主18年的互联网软件开发经验,从一名程序员小白逐步成为了一名架构师,我想通过平台将经验分享给大家,因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验,晚上进行用心精简、整理、总结、定稿,每天都会整理到12点,为了就是能让大家能够真正了解该技术栈的真正原理,最终从程序员成为一名真正的架构师,写的不一定是全站做好的,但是是全站最用心的~~~~~。

以后我会推出一些列的文章,每天都会更新,每天进步一点点,发布顺序【java的api基础、应用、实战】->【java开源技术栈及源码分析】->【java开源技术栈整合】->【java低代码开发平台的建设】
 

1.11 ByteArrayOutputStream

ByteArrayOutputStreamOutputStream 的一个实现类,它使用字节数组作为数据输出目标。通过 ByteArrayOutputStream,可以将数据写入到字节数组中。

字段:

ByteArrayOutputStream 类没有公共字段。

构造方法:
  1. ByteArrayOutputStream()

    • 创建一个新的 ByteArrayOutputStream,初始大小为 32 字节。

  2. ByteArrayOutputStream(int size)

    • 创建一个新的 ByteArrayOutputStream,初始大小为指定的 size 字节。

方法摘要:
  1. void write(int b)

    • 将指定的字节写入此输出流。

  2. void write(byte[] b, int off, int len)

    • 将指定字节数组中从偏移量 off 开始的 len 个字节写入此输出流。

  3. void writeTo(OutputStream out)

    • 将此输出流的所有内容写入指定的输出流 out

  4. void reset()

    • 重置此输出流,以便再次使用它而无需创建新的字节数组。

  5. byte[] toByteArray()

    • 创建一个新分配的字节数组。其大小是此输出流的当前大小,内容是当前输出流的拷贝。

  6. int size()

    • 返回此输出流的当前大小。

  7. String toString()

    • 将此输出流的内容转换为一个字符串,使用平台的默认字符集。

  8. String toString(String charsetName)

    • 将此输出流的内容转换为一个字符串,使用指定的字符集 charsetName

  9. void close()

    • 关闭此输出流并释放与此流关联的所有系统资源。

简单使用例子:
javaCopy code
import java.io.ByteArrayOutputStream;
import java.io.IOException;
​
public class ByteArrayOutputStreamExample {
​
    public static void main(String[] args) {
        // 创建 ByteArrayOutputStream
        try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
            // 写入字节数据
            outputStream.write("Hello, ByteArrayOutputStream!".getBytes());
​
            // 获取字节数组
            byte[] byteArray = outputStream.toByteArray();
​
            // 打印输出
            System.out.println(new String(byteArray));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在这个简单的例子中,我们使用 ByteArrayOutputStream 将字符串数据写入字节数组中,然后通过 toByteArray 方法获取字节数组,并最终将其转换为字符串进行打印。请注意,这里使用了 try-with-resources 语句确保输出流被正确关闭。

应用场景

ByteArrayOutputStream 主要适用于以下一些场景:

  1. 内存缓冲区:

    • 当需要在内存中动态构建一个字节数组时,ByteArrayOutputStream 提供了一个方便的方式。它允许向输出流中写入数据,然后通过 toByteArray 方法获取整个字节数组。

    javaCopy code
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    outputStream.write("Data1".getBytes());
    outputStream.write("Data2".getBytes());
    byte[] result = outputStream.toByteArray();
  2. 数据转换:

    • 在一些场景中,可能需要将不同来源的数据(如字符串、文件、网络等)合并为一个字节数组。ByteArrayOutputStream 可以用于收集这些数据,并在最后获取合并后的字节数组。

    javaCopy code
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    outputStream.write(stringData.getBytes());
    outputStream.write(fileData.getBytes());
    outputStream.write(networkData.getBytes());
    byte[] result = outputStream.toByteArray();
  3. 动态生成二进制数据:

    • 当需要生成动态的二进制数据,例如生成图像、音频等二进制格式文件时,ByteArrayOutputStream 可以用于构建这些数据。

    javaCopy code
    ByteArrayOutputStream imageOutputStream = new ByteArrayOutputStream();
    // 将图像数据写入 imageOutputStream
    // ...
    byte[] imageData = imageOutputStream.toByteArray();
  4. 缓存数据:

    • 在一些需要在内存中暂时缓存数据的场景中,ByteArrayOutputStream 提供了一个简单的缓冲区,可以方便地将数据写入其中,并在后续操作中获取整个缓冲区。

    javaCopy code
    ByteArrayOutputStream cacheStream = new ByteArrayOutputStream();
    // 在不同的操作中向 cacheStream 写入数据
    // ...
    byte[] cachedData = cacheStream.toByteArray();

总体而言,ByteArrayOutputStream 在需要在内存中动态构建字节数组、合并数据、生成二进制数据等场景中非常有用。由于它实现了 AutoCloseable 接口,也可以使用 try-with-resources 语句确保资源被正确关闭。

实战例子

例子一

以下是一个简单的实战例子,演示如何使用 ByteArrayOutputStream 将字符串数据写入字节数组,并在之后将字节数组转换为字符串:

javaCopy code
import java.io.ByteArrayOutputStream;
import java.io.IOException;
​
public class ByteArrayOutputStreamExample {
​
    public static void main(String[] args) {
        // 创建 ByteArrayOutputStream
        try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
            // 写入字符串数据
            writeToOutputStream(outputStream, "Hello, ");
            writeToOutputStream(outputStream, "ByteArrayOutputStream!");
            
            // 获取字节数组
            byte[] byteArray = outputStream.toByteArray();
​
            // 将字节数组转换为字符串并打印
            String result = new String(byteArray);
            System.out.println(result);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
​
    private static void writeToOutputStream(ByteArrayOutputStream outputStream, String data) throws IOException {
        // 将字符串数据写入 ByteArrayOutputStream
        outputStream.write(data.getBytes());
    }
}

在这个例子中,我们创建了一个 ByteArrayOutputStream 对象 outputStream,然后通过 writeToOutputStream 方法向其写入两段字符串数据。最后,通过 toByteArray 方法获取整个字节数组,并将其转换为字符串进行打印。

这个例子展示了如何逐步向 ByteArrayOutputStream 写入数据,并在最后获取整个字节数组。在实际应用中,可以根据需求动态构建字节数组,然后对其进行后续处理,例如将数据存储到文件、发送到网络等。

例子二

为了提供更具体和实际的示例,以下是一个简化的项目实战代码实现,模拟一个图片上传服务。在这个示例中,使用 ByteArrayOutputStream 将上传的图片数据写入字节数组,然后模拟将这些字节数组保存到文件系统或者其他存储介质中。

javaCopy code
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
​
public class ImageUploadService {
​
    public static void main(String[] args) {
        // 模拟接收上传的图片数据
        InputStream uploadedImageStream = simulateImageUpload();
​
        // 处理上传的图片数据
        processUploadedImage(uploadedImageStream);
    }
​
    private static InputStream simulateImageUpload() {
        // 模拟一个输入流,实际项目中可以是通过网络接收的输入流
        // 这里简化为使用字符串构造一个 ByteArrayInputStream
        String imageData = "MockImageDataFromClient";
        return new ByteArrayInputStream(imageData.getBytes());
    }
​
    private static void processUploadedImage(InputStream uploadedImageStream) {
        try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
            // 将上传的图片数据写入 ByteArrayOutputStream
            copyInputStreamToOutputStream(uploadedImageStream, outputStream);
​
            // 获取字节数组
            byte[] imageData = outputStream.toByteArray();
​
            // 在实际项目中,可以将字节数组保存到文件系统、数据库等存储介质
            saveImageToFileSystem(imageData, "uploaded_image.jpg");
​
            System.out.println("Image upload and processing completed.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
​
    private static void copyInputStreamToOutputStream(InputStream input, ByteArrayOutputStream output) throws IOException {
        byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = input.read(buffer)) != -1) {
            output.write(buffer, 0, bytesRead);
        }
    }
​
    private static void saveImageToFileSystem(byte[] imageData, String fileName) throws IOException {
        // 在实际项目中,可以将字节数组保存到文件系统、数据库等存储介质
        Path filePath = Path.of(fileName);
        Files.write(filePath, imageData, StandardCopyOption.REPLACE_EXISTING);
    }
}

这个示例中,simulateImageUpload 方法模拟了接收到的图片上传流,而 processUploadedImage 方法使用 ByteArrayOutputStream 处理了这个上传的图片数据。在实际项目中,可以根据业务需求将字节数组保存到文件系统、数据库等存储介质中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/293423.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023年终总结(脚踏实地,仰望星空)

回忆录 2023年,经历非常多的大事情,找工作、实习、研究生毕业、堂哥结婚、大姐买车、申博、读博、参加马拉松,有幸这一年全家人平平安安,在稳步前进。算是折腾的一年,杭州、赣州、武汉、澳门、珠海、遵义来回跑。完成…

rotate-captcha-crack项目重新训练百度旋转验证码角度预测模型

参考: building-powerful-image-classification-models-using-very-little-data.html https://github.com/Starry-OvO/rotate-captcha-crack (主)作者思路:https://www.52pojie.cn/thread-1754224-1-1.html 纠正 新版百度、百家…

晨控 CK-FR08-A01 与汇川 H5U 系列 PLC 通讯手册

晨控 CK-FR08-A01 与汇川 H5U 系列 PLC 通讯手册 准备阶段 软件 : AutoShop PLC : H5U-1614MTD-A8 读写器: CK-FR08-A01 交换机: 标准POE交换机 电源 : 24V直流电源 简介 CK-FR08-A01 是一款基于射频识别技…

C语言实用第三方库Melon开箱即用之多线程模型

在之前的文章中(开发利器——C 语言必备实用第三方库),笔者介绍了一款Linux/UNIX下C语言库Melon的基本功能,并给出了一个简单的多进程开箱即用的例子。 本文将给大家介绍Melon中多线程的使用方法。 在Melon中有三种多线程模式&a…

Kodi 开源多媒体播放器

Kodi (原名 XBMC) 是一款经典开源免费、跨平台且极其强大专业的多媒体影音播放器,包含专业的影音内容管理以及解码播放功能于一体,提供适合在手机/电视/投影/大屏幕上显示的全屏界面,无线手机遥控操作方式,以及功能相当丰富的插件…

第三部分使用脚手架:vue学习(66-69)

文章目录 66.props配置67 mixin混入68 插件69 scoped样式 66.props配置 props配置,说白了就是调用子组件,传参数用的。 父组件的写法:传参。传参必须加引号,否则报错。 子组件的写法:接收。接受有3种方式&#xff0c…

【观察】Aginode安捷诺:坚守“长期主义”,服务中国数字经济

毫无疑问,随着整个社会加速数字化转型,尤其是5G、人工智能、大数据等技术兴起,以及智慧医疗、智慧金融、智能制造等应用加速落地,算力网络在经济社会发展中扮演了愈来愈重要的角色,成为支撑数字经济蓬勃发展的“新引擎…

快手推荐算法工程师三面回顾

快手三次技术面试一次HR面试的简单回顾,希望对大家有所启发。 一面 面试官一上来就让写算法题,第一个是计算岛屿数量,第二个是最长回文字串。 然后就是介绍自己的论文。对于论文的工作,面试官只是在问关于论文的问题&#xff0…

STM32F4XX使用SWO实现printf功能

一 名词说明 SWO:Serial Wire Output,串行线输出 ITM:Instrumentation Trace Macrocell,仪器跟踪宏单元二 使用软件 1 keil 2 JLinkSWOViewer三 swo实现代码 #include "stm32f4xx_hal.h" #include "stdio.h&quo…

babel执行流程

babel简单执行流程 为了验证方便 这边 使用的命令是 babel src/index.js --out-file lib/index.compiled.js,这样可以定位 babel 中的files.js 相对目录比较简单 执行scripts 中的 build 命令 执行 package.json 中的scripts 命令 <!-- package.json 中的命令 -->"…

一款适用于低功耗应用 高效降压转换器TPS62621YFFR 基本原理及主要参数介绍

TPS62621YFFR提供针对电池供电的便携式应用优化的高频同步降压DC/DC转换器。适用于低功耗应用&#xff0c;支持高达600毫安的负载电流&#xff0c;并允许使用低成本的芯片电感器和电容器。 该设备具有2.3 V至5.5 V的宽输入电压范围&#xff0c;支持由具有扩展电压范围的锂离子…

分布式锁Lock4J 使用总结

Lok4j 简介 lock4j是一个分布式锁组件&#xff0c;其提供了多种不同的支持以满足不同性能和环境的需求。 立志打造一个简单但富有内涵的分布式锁组件。 特点 简单易用&#xff0c;功能强大&#xff0c;扩展性强。支持redission,redisTemplate,zookeeper。可混用&#xff0c…

互联网分布式应用之RabbitMQ

RabbitMQ Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台。 课程内容的介绍 1. RabbitMQ介绍安装 2. Rabbi…

【大数据进阶第二阶段之Hadoop学习笔记】Hadoop 概述

【大数据进阶第二阶段之Hadoop学习笔记】Hadoop 概述-CSDN博客 【大数据进阶第二阶段之Hadoop学习笔记】Hadoop 运行环境搭建-CSDN博客 【大数据进阶第二阶段之Hadoop学习笔记】Hadoop 运行模式-CSDN博客 1、 Hadoop 是什么 &#xff08;1&#xff09;Hadoop是一个由Apache基…

美团后端Java实习一面面经

说一下AOP&#xff1f; 面向切面编程&#xff0c;通过预编译方式和运行期动态代理实现程序功能的统一维护的技术。可以减少程序中相同代码的编写&#xff0c;简化开发&#xff0c;使得接口更加专注于业务 相关概念 Aspect&#xff08;切面&#xff09;&#xff1a; Aspect 声…

NVIDIA 正式发布中国特供 RTX 4090D,减量不减价刀法再进化

随着中国特供 RTX 4090D 显卡发布&#xff0c;老美禁售导致的 NVIDIA 旗舰游戏显卡断供、涨价风波注定要结束了。 就在上周四&#xff0c;NVIDIA 正式发布了应对老美禁令的中国特供版 RTX 4090D 显卡。 别的不说&#xff0c;前段时间疯狂炒作、高价囤货 RTX 4090 的商贩们首先…

在机械硬盘和固态硬盘上分别打一个压缩包,时间相差几倍

机械硬盘&#xff0c;它的原理类似于光盘&#xff0c;主要结构是一个高速旋转的盘片的和在盘片上来回读写数据的磁头。而固态硬盘则是以电子存储的方式来储存数据的&#xff0c;主要由主控芯片、闪存芯片、固件算法等组成。 一般来说机械硬盘的读写速度在60-170MB/s之间&#x…

win10提示“KBDROST.DLL文件丢失,软件无法启动”,快速修复方法

KBDROST.DLL是Windows操作系统中的一个动态链接库文件&#xff0c;主要与键盘布局或键盘输入有关。在Windows系统中&#xff0c;每种语言都有一个相应的DLL文件来处理键盘输入&#xff0c;KBDROST.DLL文件主要用于处理俄语键盘布局。 所以&#xff0c;当我们使用到俄语输入相关…

Linux第12步_磁盘重新分区

解决“挂载后的U盘出现中文乱码”后&#xff0c;我们接着学习“磁盘重新分区”&#xff0c;熟悉fdisk命令。 1、删除磁盘的分区 输入“cd /回车”&#xff0c;进入根目录 输入“ls /dev/sd*回车”&#xff0c;显示dev以sd所有文件。 输入“sudo fdisk /dev/sdb1回车” 输入…

学习汽车LIN总线该如何入门?

关注菲益科公众号—>对话窗口发送 “CANoe ”或“INCA”&#xff0c;即可获得canoe入门到精通电子书和INCA软件安装包&#xff08;不带授权码&#xff09;下载地址。 目录 1. 车载LIN总线诞生背景和使用场景 2. LIN总线硬件接口 3. Lin总线协议 4. 总结 1、车载LIN总线…
最新文章