【问题标题】:How to use ByteArrayOutputStream and DataOutputStream simultaneously in Java?如何在 Java 中同时使用 ByteArrayOutputStream 和 DataOutputStream?
【发布时间】:2010-06-06 14:32:26
【问题描述】:

我在这里遇到了很大的问题,我认为是因为我不太了解我应该如何使用Java提供的API。

我需要将intbyte[] 写入byte[]

我想用DataOutputStream来解决writeInt(int i)write(byte[] b)的数据写入,并且能够将其放入字节数组中,我应该使用ByteArrayOutputStream方法toByteArray().

我知道这些类使用 Wrapper 模式,所以我有两个选择:

DataOutputStream w = new DataOutputStream(new ByteArrayOutputStream());

ByteArrayOutputStream w = new ByteArrayOutputStream(new DataOutputStream());

但在这两种情况下,我都“松散”了一个方法。在第一种情况下,我无法访问toByteArray() 方法,在第二种情况下,我无法访问writeInt() 方法。

我应该如何一起使用这些类?

【问题讨论】:

    标签: java wrapper bytearrayoutputstream dataoutputstream


    【解决方案1】:

    像这样:

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    DataOutputStream w = new DataOutputStream(baos);
    
    w.writeInt(100);
    w.write(byteArray);
    
    w.flush();
    
    byte[] result = baos.toByteArray();
    

    实际上,您的第二个版本根本无法使用。 DataOutputStream 需要在其中写入数据的实际目标流。你不能做new DataOutputStream()。实际上没有这样的构造函数。

    【讨论】:

    • 我一直在想,我真的有理由刷新一个包装好的ByteArrayOutputStream吗?
    • 没有,但你永远不知道包装器的行为。它实际上可以缓冲一些东西,所以我习惯性地刷新包装器:)。如果它是直通包装器,它不应该受到伤害。
    • 你能声明 byteArray 变量吗?以及实际上是什么 w.write(byteArray);做什么?
    • 啊它现在可以工作了,我的十六进制编辑器出现了一些问题(我将它写入文件只是为了证明它并且它有效)
    【解决方案2】:

    您能否创建一个变量来保存 ByteArrayOutputStream 并将其传递给 DataOutputStream。

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    DataOutputStream dos = new DataOutputStream(baos);
    dos.writeInt(1);
    byte[] result = dos.toByteArray();
    

    【讨论】:

      【解决方案3】:

      使用前一种情况 - 将 DataOutputStream 包裹在 ByteArrayOutputStream 周围。只要确保您保存对ByteArrayOutputStream 的引用即可。完成后,close() 或至少 flush() DataOutputStream,然后使用 ByteArrayOutputStream 的 toByteArray 方法。

      【讨论】:

        【解决方案4】:

        如果您通过PipedInputStream/PipetOutputStream 将输出流连接到输入流,则可以使用流方法。然后您将使用输入流中的数据。

        无论如何,如果您需要做的事情很简单并且不需要流方法,我会使用您拥有的java.nio.ByteBuffer

        • put(byte[] src) 为您的byte[]
        • putInt(int value)
        • byte[] array()获取内容

        【讨论】:

          【解决方案5】:

          你不需要更多这样的

          Example exampleExample = method(example); 
          ByteArrayOutputStream baos = new ByteArrayOutputStream(); marshaller.marshal(exampleExample , baos);
          Message message = MessageBuilder.withBody(baos.toByteArray()).build();
          

          【讨论】:

          【解决方案6】:

          Integer 类有一个方法来获取 int 的字节值。 Integer.byteValue()

          【讨论】:

            猜你喜欢
            • 2018-03-09
            • 2020-02-26
            • 2011-11-28
            • 1970-01-01
            • 2013-03-12
            • 2015-07-23
            • 2016-06-01
            • 2011-06-22
            • 1970-01-01
            相关资源
            最近更新 更多