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
中,才能使用它。我不会仅仅为了能够调用一个方法而这样做(如果您需要它的其他方法,那么这听起来确实是个好主意)。像我发布的静态方法很有用——如果您构建了一个更大的应用程序,那么通常会有一些带有实用方法的类。