0

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

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

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

4

2 回答 2

1

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

如果您将字节流分块为通过队列传递的较小字节数组,则此模式也可以与字节流一起使用,但这并不总是合适的(例如,如果模块 1 读取,模块 2 压缩,模块 3 加密,那么您可能会更好不要将数据保存在流中,除非您有一些合理的方法来分块数据)。

于 2013-05-01T02:24:51.067 回答
1

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

或者,您可以使用像ZeroMQ这样的消息队列和传递框架来实现一些更重的东西。
--ap

于 2013-05-01T02:25:38.143 回答