2011-04-11 67 views
2

我有發送加密的對象到服務器的客戶端程序,現在用了一堆流的做到這一點:何時使用Java中的BufferedInput/OutputStreams?

//httpOutput is the HTTPUrlConnection request stream 
    Cipher rsaCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 
    rsaCipher.init(Cipher.ENCRYPT_MODE, certificate); 
    CipherOutputStream cipherOutput = new CipherOutputStream(httpOutput, rsaCipher); 

    BufferedOutputStream bufferedOutput = new BufferedOutputStream(cipherOutput); 
    ObjectOutputStream objectOutput = new ObjectOutputStream(bufferedOutput); 

上午我把緩衝區在正確的地方/有什麼關係?

回答

2

緩衝應儘可能最接近原始流。在這種情況下,它應該包裝http輸出流。

2

您可能有興趣閱讀​​。緩衝流允許您處理大塊數據而不是單個字節。在大多數情況下,這允許從磁盤更快地讀取和寫入。

我從來沒有做過性能測試,但是如果我使用緩衝流,它通常在包裝的早期階段。例如,我會先緩衝httpOutput流,然後將CipherOutputStream應用於該流,最後再應用ObjectOutputStream。但是,我不確定爲什麼我這樣做,這只是我一直這樣做的方式 - 儘可能早地應用緩衝。

+1

你我明白了。我要問的是,如果將緩衝區放在3個數據流的鏈上,會導致所有3個數據流以塊的形式寫入,或者只有緩衝區下方的數據流將以塊的形式寫入? – twisted 2011-04-11 00:46:31

+0

我會編輯我的答案以反映這一點。 – 2011-04-11 00:55:37

4

我把緩衝區放在正確的地方?

是的。通常,最好將緩衝流盡可能靠近生成或使用數據的代碼。這是假定較低層可以比小塊更有效地處理大塊數據。

重要嗎?

這取決於下面的內容,特別是組塊的性能增益在每個級別的性能。如果性能增益很小,那麼它並不重要。但是,如果性能增益很大(例如,在您正在進行系統調用的階段),那麼緩衝就位非常重要。


有幾種情況,插入緩衝流可能會降低性能(一點)。例如:

  • 如果應用程序代碼(生產者/消費者)正在讀取/大塊寫入數據,或
  • 如果流寫入/從內存中的緩衝區中讀取的,並且沒有過濾/轉換,可以從夾具中獲益。

在這種情況下,緩衝不幫助,並且由於額外的方法調用和按呼叫緩衝狀態管理增加了性能成本。但是,即使流是應用程序的性能關鍵部分,性能損失也不太可能是顯着的。 (但如果性能是一個重要的要求,簡介!)

相關問題