Java中的管道输入流

Java中的管道输入流,java,data-structures,inputstream,Java,Data Structures,Inputstream,Java InputStreams背后的主要思想是,一旦它被使用,您就无法重新读取该数据。一般来说,这种情况在大多数情况下都足够好 然而,在某些情况下,我们可能希望以不同的方式多次处理某些数据。例如,假设我正在编写一个类似git的工具。因此,我希望首先生成数据的散列,然后存储数据,并可能对同一数据执行更多操作(例如,将数据复制到其他地方或其他任何地方) 我喜欢将此过程想象为下图所示: data --> hash() --> save() --> replicate() --&g

Java InputStreams背后的主要思想是,一旦它被使用,您就无法重新读取该数据。一般来说,这种情况在大多数情况下都足够好

然而,在某些情况下,我们可能希望以不同的方式多次处理某些数据。例如,假设我正在编写一个类似git的工具。因此,我希望首先生成数据的散列,然后存储数据,并可能对同一数据执行更多操作(例如,将数据复制到其他地方或其他任何地方)

我喜欢将此过程想象为下图所示:

data --> hash() --> save() --> replicate() --> ...
          |           |            |
          ▼           ▼            ▼
        aa231e      /A/aa231e    http://example.org/A/aa231e
更新开始

显然,只要hash()函数使用了前几个字节,我们就可以在hash函数继续运行的同时,将它们重新用于save()函数。因此,并行化hash()、save()、replicate()等

更新结束

现在,我想知道:

  • 使用Java有可能实现这一点吗?我有一些模糊的想法,包括实现自定义InputStream和使用共享缓冲区,但我真的不确定这是正确的方法
  • 如果(1)的答案是肯定的,如何回答?如果答案是否定的,你会建议我怎么做
  • 是否有任何可用的库/框架可用于实现这种类型的管道
  • 我还想了解任何可能的解决方案的利弊以及原因


    另外,我不是在寻找一种能够一次又一次地打开、消耗、关闭和重新打开同一个流的解决方案。

    请查看,尤其是标记和重置方法。再看看PushbackInputStream,这并不是“InputStream背后的主要思想”。查看
    标记
    重置
    方法,它们是在
    InputStream
    本身上定义的。@JamesKPolk谢谢。我用更多的描述更新了我的答案。我想我可以看到使用标记/重置有多大帮助。然而,这是否也适用于大量数据?在问题的更新版本中,我补充道,将流程并行化将是非常好的。谢谢对于SO来说,这不是一个好问题,因为它主要处理特定的编程问题(即附加代码的问题)。也许还有更好的。也就是说,您应该考虑总体设计,而不是如何将其全部塞进InputStream抽象中。通常,如果您有某种类型的数据源,您可以让它生成新的输入流,以便您可以按预期使用它们—顺序数据访问和可组合性。如果您只需要一个散列,那么只需向源代码中添加一个“计算散列”方法,而不需要InputStreams。再看看PushbackInputStream,这并不是“InputStream背后的主要思想”。查看
    标记
    重置
    方法,它们是在
    InputStream
    本身上定义的。@JamesKPolk谢谢。我用更多的描述更新了我的答案。我想我可以看到使用标记/重置有多大帮助。然而,这是否也适用于大量数据?在问题的更新版本中,我补充道,将流程并行化将是非常好的。谢谢对于SO来说,这不是一个好问题,因为它主要处理特定的编程问题(即附加代码的问题)。也许还有更好的。也就是说,您应该考虑总体设计,而不是如何将其全部塞进InputStream抽象中。通常,如果您有某种类型的数据源,您可以让它生成新的输入流,以便您可以按预期使用它们—顺序数据访问和可组合性。如果您只需要一个散列,那么只需向源添加一个“计算散列”方法,而无需输入流。