【问题标题】:Reading chunks of bytes from an InputStream从 InputStream 中读取字节块
【发布时间】:2023-03-30 23:10:01
【问题描述】:

在我的应用程序中,我通过蓝牙接收字节流。 我正在使用DataInputStream 从输入流中一次读取固定数量的字节:

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

我可以通过将 mInStream 包装在 BufferedInputStream 中并将此 BufferedInputStream 放入 DataInputStream 来提高性能吗? 例如:

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

这会提高性能吗?还是会因为我从输入流中读取恒定数量的字节而保持不变?

谢谢

【问题讨论】:

    标签: java android bluetooth buffer inputstream


    【解决方案1】:

    我可以通过将 mInStream 包装在 BufferedInputStream 中并将这个 BufferedInputStream 放入 DataInputStream 来提高性能吗?

    这取决于您正在读取的缓冲区有多大。 BufferedInputStream 的默认内部缓冲区为 8k 字节。如果您自己的缓冲区与此相当或更大,则没有优势。如果你的缓冲区是 128 或 256 字节,那几乎肯定是。

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

    readFully() 不返回值。仅当您确定需要这么多字节并且它们都应该出现在输入中时,才应该使用此方法。如果剩余的输入短于'length,它将抛出EOFException,您将丢失任何已部分读取的数据。如果您不确定应该读取多少数据,您应该使用read(byte[])read(byte[], int, int).

    【讨论】:

    • 感谢您的回复。我需要 readFully 因为我需要从字节流中解析固定长度的命令。我通过 readFully 读取的每个数据帧的长度最多为 128 字节。所以当我正确理解这一点时,我应该创建长度为 128 的缓冲区(因为这是最大命令长度)?为了获得 BufferedInputStrams 的性能,它会是一个很好的尺寸吗?
    • 我认为在这种情况下你应该使用BufferedInputStream,是的。但我担心“最多 128 个字节”和“最大命令长度”。您需要使用 恰好 预期长度的缓冲区,或者在每种情况下提供适当值的 length 参数。如果你总是读取 128 个字节,你将总是得到 128 个字节,即使命令可以更短,这就是“最多”的含义。
    • 好的,我想这不会有问题。因为它是这样的:在开始数据传输之前,我知道将要发送的命令的长度。就像,好的,在下一个数据流中,我将收到所有长度为 x 的命令。所以我创建了长度为 x 的缓冲区。并开始阅读。所以长度不会随着每个数据帧而改变。当我重新配置应用程序时,我只需使用另一个长度重新创建缓冲区数组,该长度等于要接收并再次开始读取的新命令的长度。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    • 2012-12-25
    • 2020-03-11
    • 2018-06-28
    • 2018-02-17
    • 2012-03-03
    相关资源
    最近更新 更多