2012-11-30 70 views
0

我正在使用一个库,我必须提供一个InputStream和一个PrintStream。它使用InputStream来收集数据进行处理,并使用PrintStream来提供结果。我坚持使用这个库,它的API不能被改变。Java使用流作为“缓冲区”的排序

这有两个问题,我认为有相关的解决方案。

首先,需要通过InputStream读取的数据不可预先提供。相反,数据是由应用程序的不同部分动态创建的,并通过方法调用以字符串的形式提供给我的代码。我的代码的工作是以某种方式允许库通过我提供的InputStream读取这些数据。

其次,我需要以某种方式获得写入PrintStream的结果并将其作为字符串发送到应用程序的另一部分。这需要在数据尽可能放入PrintStream后立即发生。

它看起来像我需要的是两个流对象或多或少像缓冲区。我需要一个InputStream,当我有它时可以将数据插入到它中,并且只要有一些PrintStream,我就可以抓取它的内容。这对我来说似乎有些尴尬,但我不知道该怎么做。

我想知道是否有任何东西已经存在,允许这种行为,或者如果有一个不同的(更好的)解决方案,将在我描述的情况下工作。我唯一能想到的就是试图用这种行为来实现流,但这可能变得很复杂(特别是因为InputStream需要阻塞直到数据可用)。

任何想法?

编辑:要说清楚,我不是在写图书馆。我正在编写应该为库提供一个InputStream来读取数据和一个PrintStream来写入数据的代码。

+1

你有什么尝试?只需要一点点编码即可启动并运行。这与标准的Socket编程没有区别。 –

+0

我开始实现InputStream和OutputStream来获得缓冲区,但是我一直在阻止InputStream缓冲区中数据不可用时如何正确阻塞。此外,该应用程序是线程化的,因此同步成为一个问题,我迷失在如何确保在正确的情况下阻塞正确的线程以及如何在数据可用时再次唤醒它们。 – dawsonc623

回答

0

看起来这两个流都需要不断的读/写,所以你需要两个彼此独立的线程。该模式类似于JMS,在这种情况下,您将信息提供给“队列”或“主题”,并等待它被处理,然后放入“输出”队列/主题。这可能会引入额外的移动部分,但是您可以编写一个简单的客户端将信息放置到JMS队列中,然后让侦听器只抓取邮件并将其不断输入到输入流中。然后再从输出流中读取一段代码,并根据需要做你需要的。 希望这有助于。