Java 从InputStream读取传感器数据

Java 从InputStream读取传感器数据,java,stream,inputstream,Java,Stream,Inputstream,在我的应用程序中,我通过蓝牙接收传感器数据,并希望以高效的方式读取数据。 数据流如下所示: 04 64 E2 FF 4904 64 E3 FF 4A04 64 E1 FF 48 因此,在本例中,04是新数据帧的开始。(04描述了即将出现的字节数) 我使用InputStream对象读取数据流。 如何将流读入缓冲区,以便在之后解码字节? 问题是读取(缓冲区、偏移量、长度)不能保证读取长度字节量。有时它小于长度。逐字节读取数据是低效的。 从输入流读取解码数据的常用方法是什么 一种常见的方法是创建一个小

在我的应用程序中,我通过蓝牙接收传感器数据,并希望以高效的方式读取数据。 数据流如下所示:

04 64 E2 FF 49
04 64 E3 FF 4A
04 64 E1 FF 48

因此,在本例中,
04
是新数据帧的开始。(
04
描述了即将出现的字节数)

我使用InputStream对象读取数据流。 如何将流读入缓冲区,以便在之后解码字节? 问题是
读取(缓冲区、偏移量、长度)
不能保证读取
长度
字节量。有时它小于
长度
。逐字节读取数据是低效的。 从输入流读取解码数据的常用方法是什么


一种常见的方法是创建一个小型实用程序方法,确保它读取您要求它读取的字节数:

public static void readFully(InputStream in, byte[] buffer, int offset, int length) throws IOException {
    int total = 0;
    while (total < length) {
        int r = in.read(buffer, offset + total, length - total);
        if (r < 0)
            throw new EOFException();
        total += r;
    }
}
publicstaticvoid ready(InputStream-in,byte[]buffer,int offset,int length)引发IOException{
int-total=0;
while(总长度<长度){
int r=in.read(缓冲区、偏移量+总计、长度-总计);
if(r<0)
抛出新的EOFEException();
总+=r;
}
}

您可能可以在apache commons io库中找到类似的内容。

您可以在循环中使用
ByteBuffer
read
,直到读取所需的字节数。我知道,Java还包含
DataInputStream.readFully()
方法。我试试这个。然而,单独读取每个数据帧是常见的,还是我应该在缓冲区中一次读取更多帧,然后在以后再次提取每个帧?只需根据需要读取字节。要通过缓冲加快读取速度,只需将InputStream包装在一个
BufferedInputStream
DataInputStream中即可;只有将InputStream包装在
DataInputStream
中,才能使用它。我不会仅仅为了能够调用一个方法而这样做(如果您需要它的其他方法,那么这听起来确实是个好主意)。像我发布的静态方法很有用——如果您构建了一个更大的应用程序,那么通常会有一些带有实用方法的类。