【问题标题】:Byte[] to InputStream or OutputStreamByte[] 到 InputStream 或 OutputStream
【发布时间】:2011-01-06 16:20:23
【问题描述】:

我的数据库表中有一个 blob 列,为此我必须在我的 Java 程序中使用 byte[] 作为映射,并且要使用此数据,我必须将其转换为 InputStreamOutputStream。但我不知道当我这样做时内部会发生什么。谁能简要解释一下我进行此转换时发生了什么?

【问题讨论】:

  • 标题不应该是“字节数组......”或“字节数组......”或“字节[]......”而不是“数组字节......”吗?
  • 在此处查看反面:stackoverflow.com/questions/1264709/…

标签: java bytearray inputstream outputstream


【解决方案1】:

您可以按如下方式创建和使用字节数组 I/O 流:

byte[] source = ...;
ByteArrayInputStream bis = new ByteArrayInputStream(source);
// read bytes from bis ...

ByteArrayOutputStream bos = new ByteArrayOutputStream();
// write bytes to bos ...
byte[] sink = bos.toByteArray();

假设您使用的是实现标准 JDBC Blob interface 的 JDBC 驱动程序(并非全部都这样做),您可以使用 @987654325 将 InputStreamOutputStream 连接到 blob @ 和setBinaryStream 方法1,也可以直接获取和设置字节。

(通常,您应该采取适当的步骤来处理任何异常并关闭流。但是,在上面的示例中关闭bisbos 是不必要的,因为它们与任何外部资源无关;例如文件描述符、套接字、数据库连接。)

1 - setBinaryStream 方法确实是一个吸气剂。去图吧。

【讨论】:

    【解决方案2】:

    我假设您的意思是“使用”表示读取,但我将针对读取情况解释的内容基本上可以用于写入情况。

    所以你最终得到一个字节[]。这可以表示可能需要特殊类型转换(字符、加密等)的任何类型的数据。假设您想将这些数据按原样写入文件。

    首先,您可以创建一个ByteArrayInputStream,它基本上是一种按顺序将字节提供给某物的机制。

    然后您可以为您要创建的文件创建一个FileOutputStream。有多种类型的 InputStreams 和 OutputStreams 用于不同的数据源和目的地。

    最后,您将 InputStream 写入 OutputStream。在这种情况下,字节数组将按顺序发送到 FileOutputStream 进行写入。为此,我建议使用IOUtils

    byte[] bytes = ...;//
    ByteArrayInputStream in = new ByteArrayInputStream(bytes);
    FileOutputStream out = new FileOutputStream(new File(...));
    IOUtils.copy(in, out);
    IOUtils.closeQuietly(in);
    IOUtils.closeQuietly(out);
    

    反过来

    FileInputStream in = new FileInputStream(new File(...));
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    IOUtils.copy(in, out);
    IOUtils.closeQuietly(in);
    IOUtils.closeQuietly(out);
    byte[] bytes = out.toByteArray();
    

    如果您使用上面的代码 sn-ps,您将需要处理异常,我建议您在 finally 块中执行“关闭”。

    【讨论】:

    • 你不是说 - ByteArrayOutputStream out = new ByteArrayOutputStream();而是 ByteArrayOutputStream out = new ByteArrayInputStream();
    • CloseQuietly 应该在 finally 子句中。
    【解决方案3】:

    我们可以使用 ByteArrayInputStream 将 byte[] 数组转换为输入流

    String str = "Welcome to awesome Java World";
        byte[] content = str.getBytes();
        int size = content.length;
        InputStream is = null;
        byte[] b = new byte[size];
        is = new ByteArrayInputStream(content);
    

    完整示例请在此处查看http://www.onlinecodegeek.com/2015/09/how-to-convert-byte-into-inputstream.html

    【讨论】:

      【解决方案4】:

      InputStream/OutputStream 和它们正在使用的字节之间没有转换。它们是为二进制数据制作的,只是按原样逐个读取(或写入)字节。

      当您想从字节转换为字符时,需要进行转换。然后您需要使用字符集进行转换。当您从字节创建 String 或 Reader 时会发生这种情况,这些字节是为字符数据创建的。

      【讨论】:

        【解决方案5】:
        output = new ByteArrayOutputStream();
        ...
        input = new ByteArrayInputStream( output.toByteArray() )
        

        【讨论】:

          【解决方案6】:

          我确实意识到我对这个问题的回答已经晚了,但我认为社区会喜欢a newer approach to this issue

          【讨论】:

          • 循环缓冲区不能解决 OP 的问题。在所写的问题中,OP 需要单个字节数组中的 整个 内容。
          【解决方案7】:
          byte[] data = dbEntity.getBlobData();
          response.getOutputStream().write();
          

          我认为这更好,因为您已经在响应对象中有一个现有的 OutputStream。 无需创建新的 OutputStream。

          【讨论】:

            猜你喜欢
            • 2010-12-17
            • 1970-01-01
            • 2011-08-25
            • 2018-02-25
            • 2012-08-03
            • 2018-07-19
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多