2014-10-02 89 views
0

在我的應用程序中,我通過藍牙接收一個字節流。 我使用DataInputStream從輸入流中一次讀取的字節固定金額:從InputStream讀取字節塊

private final InputStream mInStream = ... 
... 
DataInputStream dataInputStream = new DataInputStream(mInStream); 
... 
while(true) { 
... = dataInputStream.readFully(buffer,0,length); 
} 

我可以通過在BufferedInputStream包裝mInStream提高性能,並把這個BufferedInputStreamDataInputStream? 例如:

private final InputStream mInStream = ... 
... 
BufferedInputStream buffInStream = new BufferedInputStream(mInStream); 
DataInputStream dataInputStream = new DataInputStream(buffInStream); 
... 
while(true) { 
... = dataInputStream.readFully(buffer,0,length); 
} 

這種增益性能是否會提高?或者它會保持不變,因爲我正在從輸入流中讀取恆定數量的字節?

感謝

回答

1

我可以通過在包裝的BufferedInputStream提高mInStream性能,並把這個的BufferedInputStream DataInputStream所成?

這取決於您讀取的緩衝區有多大。 BufferedInputStream的默認內部緩衝區是8k字節。如果你自己的緩衝區大於或等於此值,則沒有優勢。如果你的緩衝區是128或256字節,那麼幾乎可以肯定的。

... = dataInputStream.readFully(buffer,0,length); 

readFully()不返回值。只有在確定需要這麼多字節時,才應該使用這種方法,並且它們都應該出現在輸入中。如果剩餘輸入短於'length它將丟失EOFException,並且您將丟失任何已被部分讀取的數據。如果您不確定應讀取多少數據,則應使用read(byte[])read(byte[], int, int).

+0

感謝您的回覆。我需要readFully,因爲我需要從字節流中解析固定長度的命令。通過readFully讀取的每個數據幀的長度至多爲128個字節。所以正如我理解的那樣,我應該創建長度爲128的緩衝區(因爲這是最大命令長度)?爲了獲得BufferedInputStrams的性能,這將是一個很好的尺寸? – Moonlit 2014-10-02 06:25:37

+0

我認爲你應該在這種情況下使用'BufferedInputStream',是的。但我擔心'最多128字節'和'最大命令長度'。您需要使用*完全*預期長度的緩衝區,或者在每種情況下提供適當值的「長度」參數。如果你總是讀128個字節,你總是會得到128個字節,即使命令可以更短,這是'最多'意味着什麼。 – EJP 2014-10-02 06:34:40

+0

好吧,我認爲這將是沒有問題的。因爲它是這樣的:在我開始數據傳輸之前,我知道將要發送的命令的長度。就像,在下一個數據流中,我會收到所有長度爲x的命令。所以我創建了長度爲x的緩衝區。並開始閱讀。因此,每個數據幀的長度都不會改變。當我重新配置應用程序時,我只是用另一個長度重新創建緩衝區數組,該長度等於要接收的新命令的長度,然後再次開始讀取。 – Moonlit 2014-10-02 06:48:49