2016-09-06 112 views
0

我正在從文件(實際上是一個fifo管道)讀取數據。Java - 從文件讀取混合數據類型(char + int + binary)

的格式如下

SECTION_NAME 
SECTION_SIZE 
SECTION_DATA[SECTION_SIZE] 
..... 

例:

pps_frame 
1404 
<Binary data of 1404 bytes> 
sps_frame 
1000 
<Binary data of 1000 bytes> 
... 

我如何讀取的1404個字節的二進制數據在上面的例子。請注意,SECTION_SIZE保持不變。 PS:在我的本地代碼中,我將這些數據寫入管道。

+1

先讀取兩行數據。將第二行解析爲一個int X,然後讀取該文件的下一個X字節? –

+0

這些元素之間沒有分隔符嗎?是否有最後一個元素起始字符的標準? – Stallion

+0

'byte [] data = new byte [size]; in.readFully(data);'完成詹姆斯債券板球。 –

回答

1

不幸的是,這確實有點環境:首先閱讀文本,然後是二進制數據。這裏有一個解決方案,留在二進制閱讀。

FileInputStream fin = ... 
BufferedInputStream bin = new BufferedInputStream(fin, 2048); 
String name = readLine(bin); 
String lineWithSize = readLine(bin); 
int size = Integer.parseInt(lineWithSize); 
byte[] data = new byte[size]; 
bin.read(data, 0, size); 
bin.close(); 

有了一個幫助功能readLine讀取字節,並將其轉換爲文本。 作爲BufferedReader.readLine,它放棄了行尾,這裏遵循簡化的假設,行尾是LF或CR + LF。

String readLine(BufferedInputStream bin) { 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    for (;;) { 
     int ch = bin.read(); 
     if (ch == -1) { 
      break; 
     } 
     if (ch == '\r' || ch == '\n') { 
      if (ch == '\r') { 
       bin.read(); 
      } 
      break; 
     } 
     baos.write(ch); 
    } 
    return baos.toString("ISO-8859-1"); // Basic Latin-1 encoding. 
} 

使用Reader讀取文本始終使用這些字節的某些編碼進行字節轉換。到其內部的Unicode(一個字符是兩個字節的UTF-16)。因此,你不能100%完美地將字節讀入字符串。由於尺寸和轉換,它甚至不可取。

+0

真是一種解脫!謝謝。我正在嘗試它。BDW在新的BufferedInputStream(fin,2048); 2048是整個部分的最大尺寸..不是嗎? –

+0

2048是一個緩衝區大小。如果該段被讀取並且沒有更多,這將是很好的,但特別是我不希望我的for-loop單字節讀取站在那裏而沒有提到緩衝區。我們程序員的2倍的力量是迷信的。 –