网站首页 > java教程 正文
博主18年的互联网软件开发经验,从一名程序员小白逐步成为了一名架构师,我想通过平台将经验分享给大家,因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验,晚上进行用心精简、整理、总结、定稿,每天都会整理到12点,为了就是能让大家能够真正了解该技术栈的真正原理,最终从程序员成为一名真正的架构师,写的不一定是全站做好的,但是是全站最用心的~~~~~。
以后我会推出一些列的文章,每天都会更新,每天进步一点点,发布顺序【java的api基础、应用、实战】->【java开源技术栈及源码分析】->【java开源技术栈整合】->【java低代码开发平台的建设】
1.11 ByteArrayOutputStream
ByteArrayOutputStream 是 OutputStream 的一个实现类,它使用字节数组作为数据输出目标。通过 ByteArrayOutputStream,可以将数据写入到字节数组中。
字段:
ByteArrayOutputStream 类没有公共字段。
构造方法:
- ByteArrayOutputStream():
- 创建一个新的 ByteArrayOutputStream,初始大小为 32 字节。
- ByteArrayOutputStream(int size):
- 创建一个新的 ByteArrayOutputStream,初始大小为指定的 size 字节。
方法摘要:
- void write(int b):
- 将指定的字节写入此输出流。
- void write(byte[] b, int off, int len):
- 将指定字节数组中从偏移量 off 开始的 len 个字节写入此输出流。
- void writeTo(OutputStream out):
- 将此输出流的所有内容写入指定的输出流 out。
- void reset():
- 重置此输出流,以便再次使用它而无需创建新的字节数组。
- byte[] toByteArray():
- 创建一个新分配的字节数组。其大小是此输出流的当前大小,内容是当前输出流的拷贝。
- int size():
- 返回此输出流的当前大小。
- String toString():
- 将此输出流的内容转换为一个字符串,使用平台的默认字符集。
- String toString(String charsetName):
- 将此输出流的内容转换为一个字符串,使用指定的字符集 charsetName。
- 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 主要适用于以下一些场景:
- 内存缓冲区:
- 当需要在内存中动态构建一个字节数组时,ByteArrayOutputStream 提供了一个方便的方式。它允许向输出流中写入数据,然后通过 toByteArray 方法获取整个字节数组。
javaCopy code
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
outputStream.write("Data1".getBytes());
outputStream.write("Data2".getBytes());
byte[] result = outputStream.toByteArray();
- 数据转换:
- 在一些场景中,可能需要将不同来源的数据(如字符串、文件、网络等)合并为一个字节数组。ByteArrayOutputStream 可以用于收集这些数据,并在最后获取合并后的字节数组。
javaCopy code
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
outputStream.write(stringData.getBytes());
outputStream.write(fileData.getBytes());
outputStream.write(networkData.getBytes());
byte[] result = outputStream.toByteArray();
- 动态生成二进制数据:
- 当需要生成动态的二进制数据,例如生成图像、音频等二进制格式文件时,ByteArrayOutputStream 可以用于构建这些数据。
javaCopy code
ByteArrayOutputStream imageOutputStream = new ByteArrayOutputStream();
// 将图像数据写入 imageOutputStream
// ...
byte[] imageData =
imageOutputStream.toByteArray();
- 缓存数据:
- 在一些需要在内存中暂时缓存数据的场景中,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 处理了这个上传的图片数据。在实际项目中,可以根据业务需求将字节数组保存到文件系统、数据库等存储介质中。
猜你喜欢
- 2025-05-11 Excel表格里按行提取重复的数据并合并到一个单元格内
- 2025-05-11 PMC生产计划群:2025年第15周训练题答案分享
- 2025-05-11 1秒合并1000个表!Excel大神绝不外传的7个HSTACK神操作
- 2025-05-11 如何将多行拼接成一行?#办公技巧
- 2025-05-11 打工人私藏的4个动态数组公式,工作效率飙升5.5%
- 2025-05-11 java字符串连接StringBuilder,StringBuffer和+拼接区别是什么
- 2025-05-11 多表格数据合并为1个表格,学会这个函数,1个公式便能完成
- 2025-05-11 一看就懂:Go语言实现合并排序算法,就这么简单
- 2025-05-11 PMC生产计划群:2025年第17周训练题答案分享
- 2025-05-11 10秒合并800个表,VSTACK就是这么厉害!
你 发表评论:
欢迎- 最近发表
-
- Mozilla Firefox 139 Beta已上线 提供更快的HTTP/3上传速度
- Win8专享拷贝能暂停,Win7其实也可以
- ASP.NET利用WEBUPLOADER实现超大文件分片上传、断点续传
- 河汉大大的《断点续传》-------黑暗哨兵和向导的绝美爱恋
- 用C# 实现断点续传 (HTTP)
- 开源断点续传下载软件FDM获推6.21.0.5639版更新
- 前端大文件切片上传,断点续传、秒传等解决方案,VUE中使用实例
- SpringBoot 实战:文件上传之秒传、断点续传、分片上传
- 一文搞定SpringBoot分片上传、断点续传、大文件极速秒传功能
- SPRING-BOOT实现HTTP大文件断点续传分片下载
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)