我有一个每隔几秒获取一个字节数组的输入流。我知道字节数组总是按这个顺序包含一个 long、一个 double 和一个 integer。是否可以使用输入流(例如 DataInputStream)读取这些值,或者您可以建议我什么?
问问题
1435 次
2 回答
2
您可以查看java.nio.ByteBuffer
哪些提供了方法getLong()
,getDouble()
以及getInt()
。
假设你得到一个总是 20 字节的任意InputStream
值(8 字节 Long,8 字节 Double,4 字节 Int):
int BUFSIZE = 20;
byte[] tmp = new byte[BUFSIZE];
while (true) {
int r = in.read(tmp);
if (r == -1) break;
}
ByteBuffer buffer = ByteBuffer.wrap(tmp);
long l = buffer.getLong();
double d = buffer.getDouble();
int i = buffer.getInt();
于 2013-07-07T19:08:47.597 回答
2
您应该考虑使用以下方法包装 ByteBuffer:
ByteBuffer buf=ByteBuffer.wrap(bytes)
long myLong=buf.readLong();
double myDbl=buf.readDouble();
int myInt=buf.readInt();
会DataInputStream
做得很好,但性能更差:
DataInputStream dis=new DataInputStream(new ByteArrayInputStream(bytes));
long myLong=dis.readLong();
double myDbl=dis.readDouble();
int myInt=dis.readInt();
要从其中任何一个中获取字符串,您可以getChar()
重复使用。
假设buf
是您的 ByteBuffer 或 DataInputStream,请执行以下操作:
StringBuilder sb=new StringBuilder();
for(int i=0; i<numChars; i++){ //set numChars as needed
sb.append(buf.readChar());
}
String myString=sb.toString();
如果要读取直到缓冲区结束,请将循环更改为:
readLoop:while(true){
try{
sb.append(buf.readChar());
catch(BufferUnderflowException e){
break readLoop;
}
}
于 2013-07-07T19:09:21.650 回答