2013-07-07 41 views
0

我有一個輸入流,每隔幾秒就獲取一個字節數組。我知道字節數組總是按順序包含一個long,一個double和一個整數。是否有可能通過輸入流(例如DataInputStream)讀取此值,或者您可以告訴我什麼?Java:輸入流與字節數組

+0

可以使用'DataInputStream',就像你說的。你有什麼理由不去? – Joni

+0

不,我不知道如何將bytearrayinputstream與正常輸入流組合起來 – Maxii

回答

2

你應該考慮使用包裹字節緩衝區:

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; 
    } 
} 
+0

謝謝。當字節數組包含一個字符串。是否也可以用datainputstream讀取它? – Maxii

+0

@Maxii是的,通過重複readChar()和StringBuilder的方式。如果您希望我可以將其添加到答案中。 – hexafraction

+0

這將是不錯的 – Maxii

2

你可以看看java.nio.ByteBuffer,它提供了getLong(),getDouble()getInt()的方法。

假設你總是20個字節(8字節長,8字節雙,4字節智力)得到了一個任意InputStream

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();