【问题标题】:converting OutputStream into an InputStream将 OutputStream 转换为 InputStream
【发布时间】:2018-07-19 10:44:21
【问题描述】:

有没有办法将OutputStream 转换为InputStream

所以下面会起作用

InputStream convertOStoIS(OutputStream os) {

}

我不想使用任何库,我读到有些人能够通过字节码操作来完成此操作。

编辑

我希望能够与接收器相交,以分析数据或重定向输出。我想在某个函数给出的 on 下放置另一个 OutputStream 并将数据重定向到另一个输入流。

相关主题有ByteArrayOutputStreamPipedStream,而我的问题不是这样。

相关:

【问题讨论】:

  • 这个问题很不清楚。你的意思是你想写一些数据然后读回来?如果不是,那么“将 OutputStream 转换为 InputStream”实际上意味着什么?在需要转换之前和之后,您想做什么?请澄清。
  • @rmlan 请完整阅读答案,尤其是“更新”
  • @JimGarrison 编辑了问题
  • 你看java.io.FilterOutputStream了吗?这将允许您包装任何 OutputStream 并在写入数据时检查/修改数据。
  • @JimGarrison 遗憾的是,我只能在上面而不是下面应用它。如果我能够告诉已经创建的OutputStream 丢弃旧输出并改用自定义过滤器流,这将解决我的问题。

标签: java inputstream outputstream


【解决方案1】:

使用java.io.FilterOutputStream 包装现有的OutputStream。通过覆盖write() 方法,您可以截获输出并使用它做任何您想做的事情,将其发送到其他地方、修改它或完全丢弃它。

关于您的第二个问题,您不能在事后更改OutputStream 的接收器,即导致先前写入的数据“移动”到其他地方,但使用FilterOutputStream 您可以拦截并重定向之后写入的任何数据你包装原始的`OutputStream。

【讨论】:

  • 我不需要移动数据,只是为了能够重定向它。即使问题没有得到回答,这也解决了我最初的问题。
【解决方案2】:

要回答我自己的问题,是的,您可以像这样构建重定向:

class OutInInputRedirect {
    public final transient InputStream is;
    public final transient OutputStream os;

    public OutInInputRedirect() throws IOException {
        this(1024);
    }

    public OutInInputRedirect(int size) throws IOException {
        PipedInputStream is = new PipedInputStream(size);
        PipedOutputStream os = new PipedOutputStream(is);

        this.is = is;
        this.os = os;
    }
}

只需在需要的地方使用OutputStreamInputStream 替换,注意OutputStream 的关闭也会关闭InputStream

这很容易并且可以按预期工作。无论哪种方式,您都无法更改已连接的流(没有反射)。

【讨论】:

    猜你喜欢
    • 2020-09-28
    • 1970-01-01
    • 2018-12-12
    • 2010-09-08
    • 2022-01-02
    • 2015-01-13
    • 2020-11-27
    • 2019-06-17
    • 2013-09-18
    相关资源
    最近更新 更多