2013-05-01 37 views
0

所以現在我有一堆模塊。這就像一條裝配線。有數據流過,每個模塊都會處理數據,也可以說下一個模塊會消耗前一個模塊產生的輸出。每個模塊都有望成爲獨立且可重用的模塊。這是我想的一個典型場景。使用InputStream/OutputStream處理通過模塊的數據流

所以最初我將每個模塊的接口設計爲模塊(InputStream是OutputStream os)。所以它可以將文件,無論來源,作爲輸入和輸出。當你想到數據流時,前一個模塊的輸出流將進入下一個模塊的輸入流。但後來我意識到Java甚至沒有從OutputStream到InputStream的直觀/簡單的方法。 (注:這個問題是不是關於如何實現這一目標對於那些誰是有興趣, How to convert OutputStream to InputStream?。)

在我看來,可能的OutputStream/InputStream中並不意味着這樣的目的。 那麼在這種情況下,設計處理數據流的接口的最佳方式是什麼?

回答

1

對於離散對象,你可以使用帶有ConcurrentLinkedQueuesBlockingQueues生產者/消費者模式 - 每個模塊都有自己的隊列,它會不斷地poll其隊列(或使用take如果它是一個BlockingQueue的),處理對象,offer它到下一個模塊的隊列。

如果將模塊分塊爲通過隊列的較小字節數組,則此模式也可以使用字節流,但這並不總是適當的(例如,如果module1讀取,module2壓縮和module3加密,那麼您將數據保存在數據流中可能會更好,除非你有合理的方法來分塊數據)。

+0

是的,我的情況非常像module1解析,模塊2壓縮和模塊3加密。分塊數據使其適合ConcurrentLinkedQueues或BlockingQueues模式沒有意義。這一切都是按順序發生的。簡單,因爲它不涉及併發。 – kakacii 2013-05-01 04:32:51

+0

我肯定會聽到並瞭解更多信息,但到目前爲止,我認爲InputStream/OutputStream設計的很糟糕。這將是處理數據接口的一種很好且清晰的方式。 – kakacii 2013-05-01 04:35:14

+0

您可以使用[IOUtils](http://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/IOUtils.html)中的'copy'方法解決此問題,例如[將inputstream複製到outputstream](http://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/IOUtils.html#copy%28java.io.InputStream,%20java.io。 OutputStream%29) – 2013-05-01 04:51:18

1

您可以創建一個通用模塊,該模塊實現OutputStreamInputStream的轉換,並將模塊的一個實例放置在每個其他模塊之間。你甚至可以很喜歡它,並使模塊足夠智能,以將消息從一個模塊路由到任何其他模塊。這將成爲一種網關或路由器類型模塊。

另外,你可以實現一些重量更重的消息排隊和傳遞框架如ZeroMQ
--ap

+0

把OutputStream放到InputStream轉換中,因爲我正在做一個工具類。但它並沒有改變這個事實,它是尷尬的,反直覺的。我所說的是,如果stream是要走的路,那麼將會有一些優雅的方法來執行OutputStream/InputStream轉換,而不是各種黑客。即使是Apache IOUtils也只能實現從InputStream到OutputStream的複製,而不是其他方式。 – kakacii 2013-05-01 04:30:48