使用InputStream / OutputStream处理通过模块的数据流

时间:2013-05-01 02:19:54

标签: java inputstream outputstream dataflow

所以现在我有一堆模块。这就像一条装配线。有数据流过,每个模块对数据做一些事情,或者你可以说下一个模块消耗前一个模块产生的输出。每个模块都有望独立且可重复使用。我认为这是一个非常典型的场景。

所以最初我将每个模块的接口设计为模块(InputStream是,OutputStream os)。因此它可以将文件(无论来源)作为输入和输出。当您考虑数据流时,前一个模块的输出流将转到下一个模块的输入流。但后来我意识到Java甚至没有直观/简单的方法将数据从OutputStream传递到InputStream。 (注意:这个问题不是关于如何实现这一点。对于那些感兴趣的人, How to convert OutputStream to InputStream?

在我看来,可能OutputStream / InputStream不是出于这样的目的。 那么在这种情况下,设计接口来处理数据流的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

对于离散对象,您可以使用带有ConcurrentLinkedQueuesBlockingQueues的生产者/消费者模式 - 每个模块都有自己的队列,并且它将不断poll其队列(或使用{{} 1}}如果它是BlockingQueue),处理对象,并take它到下一个模块的队列。

如果将这个模式块化为通过队列的较小字节数组,这个模式也可以用于字节流,但这并不总是合适的(例如,如果module1读取,module2压缩,module3加密,那么你'最好不要将数据保存在流中,除非你有一些合理的方法来分块数据。)

答案 1 :(得分:1)

您可以创建一个实现OutputStreamInputStream转换的通用模块,并在每个其他模块之间放置一个模块实例。您甚至可以使用它并使模块足够智能以将消息从一个模块路由到任何其他模块。这将成为一种网关或路由器类型模块。

或者,您可以通过消息排队和传递ZeroMQ之类的框架来实现更重一些的重量。
留学美国相关考试