startByteArrayReaderThread()方法是整個類真正的關鍵所在。這個方法的目標很簡單,就是創建一個定期地檢查 ByteArrayOutputStream緩沖區的線程。緩沖區中找到的所有數據都被提取到一個byte數組,然后寫入到 PipedOutputStream。由于PipedOutputStream對應的PipedInputStream由getInputStream ()返回,從該輸入流讀取數據的線程都將讀取到原先發送給ByteArrayOutputStream的數據。前面提到,LoopedStreams類解決了管道流存在的前二個問題,我們來看看這是如何實現的。
ByteArrayOutputStream具有根據需要擴展其內部緩沖區的能力。由于存在“完全緩沖”,線程向getOutputStream()返回的流寫入數據時不會被阻塞。因而,第一個問題不會再給我們帶來麻煩。另外還要順便說一句,ByteArrayOutputStream的緩沖區永遠不會縮減。例如,假設在能夠提取數據之前,有一塊500 K的數據被寫入到流,緩沖區將永遠保持至少500 K的容量。如果這個類有一個方法能夠在數據被提取之后修正緩沖區的大小,它就會更完善。
第二個問題得以解決的原因在于,實際上任何時候只有一個線程向PipedOutputStream寫入數據,這個線程就是由 startByteArrayReaderThread()創建的線程。由于這個線程完全由LoopedStreams類控制,我們不必擔心它會產生 IOException異常。
LoopedStreams類還有一些細節值得提及。首先,我們可以看到byteArrayOS和pipedIS實際上分別是 ByteArrayOutputStream和PipedInputStream的派生類的實例,也即在它們的close()方法中加入了特殊的行為。如果一個LoopedStreams對象的用戶關閉了輸入或輸出流,在startByteArrayReaderThread()中創建的線程必須關閉。覆蓋后的close()方法把keepRunning標記設置成false以關閉線程。另外,請注意startByteArrayReaderThread ()中的同步塊。要確保在toByteArray()調用和reset()調用之間ByteArrayOutputStream緩沖區不被寫入流的線程修改,這是必不可少的。由于ByteArrayOutputStream的write()方法的所有版本都在該流上同步,我們保證了 ByteArrayOutputStream的內部緩沖區不被意外地修改。
延伸閱讀
文章來源于領測軟件測試網 http://www.kjueaiud.com/