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

2024-01-08 23:49:11

博主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 处理了这个上传的图片数据。在实际项目中,可以根据业务需求将字节数组保存到文件系统、数据库等存储介质中。

文章来源:https://blog.csdn.net/a89879193/article/details/135401238
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。