【问题标题】:Java: I need to get byte array out of outputstreamJava:我需要从输出流中获取字节数组
【发布时间】:2017-02-13 01:36:10
【问题描述】:

在我的例子中,输出流基本上是 FileOutputStream。因此对于此代码:

ByteArrayOutputStream bos = (ByteArrayOutputStream) streamToEncrypt;

(其中 streamToEncrypt 是 OutputStream)得到这个异常:

java.lang.ClassCastException: java.io.FileOutputStream cannot be cast to java.io.ByteArrayOutputStream

我需要做的就是从这个输出流中取出字节数组。 我无权访问此级别的文件。我所拥有的只是这个输出流,我必须在将其推送到文件之前对其进行加密

【问题讨论】:

标签: java outputstream fileoutputstream bytearrayoutputstream


【解决方案1】:

这根本没有任何意义。

ByteArrayOutputStream 将您推入其中的数据... 并将它们存储在一个 字节数组 中,以便以后检索。

FileOutputStream 获取数据...并将其推送到文件中。

这是两个完全不同的类;您根本无法将一个投射转换为另一个!这就像你试图将一个字符串 cast 转换为一个整数;或者说“你苹果,现在做香蕉”,把苹果变成香蕉。根本行不通!

所以,真正的“答案”在这里:您应该退后一步,明确您打算如何处理您的数据;然后您使用符合该要求的流。

【讨论】:

    【解决方案2】:

    您不会从OutputStream 中获取字节。你让他们离开InputStream。您将字节放入OutputStream

    如果字节已经写入OutputStream,那就太迟了。再次打开文件并从中读取是您访问这些数据的唯一方法。

    如果要加密输出流,则应构造流并将其传递给写入流的代码。

    Cipher enc = Cipher.getInstance("...");
    enc.init(...);
    try (OutputStream fos = Files.newOutputStream(path);
         OutputStream os = new CipherOutputStream(fos, enc)) {
       writingObject.write(os);
    }
    

    【讨论】:

    • enc.init() 需要一个公钥。我有 .asc 格式的密钥。我可以得到有关如何使用该文件/文件路径创建密钥的提示吗?我正在使用“BOUNCY CASTLE”。感谢您的回复
    • @Patty 为此提出单独的问题。
    猜你喜欢
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 2014-10-28
    • 1970-01-01
    • 2012-04-05
    相关资源
    最近更新 更多