2011-04-19 54 views
0

讓我來介紹一下我的情況。大字節數組傳輸到客戶端

我有很多數據存儲在服務器上的文件中。我正在使用JDK7中的AIO來編寫和閱讀這些文件。因此,我正在使用ByteBuffer進行讀取和寫入操作。

問題是我已經對AsynchronousFileChannel執行讀操作了,我想將讀操作中使用的ByteByffer的內容傳送給客戶端。因此,我真的想發送字節。

什麼是最好的方式從這裏走。我不想發送ByteBuffer,因爲我有一個重用的池,因此這不是一個選項。我希望能夠甚至可以組合多個讀取並且一次發送幾個ByteBuffer(s)的內容。

那我要發什麼。只是一個字節[]數組?或者我需要一些流?這裏最好的解決方案是什麼?

我正在使用RMI進行通信。

Thanx提前。

+0

用java重新命名了你的問題。更有可能以這種方式得到迴應。 – 2011-04-19 15:44:41

+0

如果性能很關鍵,我不會使用標準的Java RMI。你做的任何事情都不會有所作爲。如果你不得不使用Java RMI,我不會擔心性能太多。 ;) – 2011-04-19 15:56:52

回答

0

除非有一個非常好的理由,否則只需發送字節數組以及足夠的元數據以便提供可靠的服務。

您需要通過RMI來回傳輸的底層實現越少越好。特別是當您使用尚未普遍使用的Java 7時。

+0

其實沒有一個好的理由不這樣做。我想我會這樣做,因爲它接縫最簡單,並不需要涉及其他組件/庫/以往任何時候。 – 2011-04-20 08:54:10

0

要使用RMI,您必須檢索緩衝區的內容作爲byte[],然後將其寫入ObjectOutputStream(寫入發生在封面)。假設您當前正在使用直接緩衝區,這意味着在Java堆中創建數組的CPU時間以及在寫入該數組後垃圾收集該數組的CPU時間,以及該流保留該引用的可能性過長,導致內存不足的錯誤。

在我看來,更好的方法是打開一個SocketChannel到目的地並用它來寫入緩衝區的內容。當然,爲了完成這項工作,您需要編寫描述緩衝區大小的額外數據,這可能會演變成一種通信協議。

1

您可以使用RMIIO庫模擬rmi上的流,這將允許您通過RMI傳輸任意數量的字節,而不會在任何一端導致內存問題。

(免責聲明,我寫了圖書館)

+0

很酷,我推薦給別人之前:) – 2011-04-19 17:21:46

相關問題