从InputStream读取字节块

问题描述:

在我的应用程序中,我通过蓝牙接收一个字节流。 我使用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); 
} 

这种增益性能是否会提高?或者它会保持不变,因为我正在从输入流中读取恒定数量的字节?

感谢

我可以通过在包装的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