2016-09-06 5 views
0

ファイル(実際にはfifoパイプ)からデータを読み取っています。Java - ファイルから混合データ型を読み取る(char + int + binary)

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

私は上記の例では1404バイトのバイナリデータを読むにはどうすればよい:

SECTION_NAME 
SECTION_SIZE 
SECTION_DATA[SECTION_SIZE] 
..... 

例は次のように

形式です。 SECTION_SIZEは変化しないことに注意してください。

PS:私のネイティブコードでは、このデータをパイプに書き込んでいます。

+1

最初の2行のデータを読み取ります。 2行目をint Xにパースし、ファイルの次のXバイトを読み込みますか? –

+0

これらの要素の間にセパレータはありませんか?最後の要素開始文字の基準はありますか? – Stallion

+0

'byte [] data =新しいバイト[size]; in.readFully(data); 'ジェームズボンドクリケットを完成させる。 –

答えて

1

残念なことに、実際にはちょっとしたことですが、まず最初にテキストを読んでから、バイナリデータを読んでください。ここでは、バイナリの読書にとどまる解決策です。ヘルプ機能readLine

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

バイトを読み取り、テキストに変換します。 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(charは2バイトのUTF-16です)。したがって、100%完全にバイトをStringに読み込むことはできません。サイズと変換のために、それは望ましくない。

+0

どのような安堵!ありがとうございました。私は今、それを試しています..新しいBufferedInputStreamのBDW(フィン、2048); 2048は全セクションの最大サイズです。そうではありませんか? –

+0

2048はバッファサイズである。セクションがそれを読んでいてそれ以上のものではないといいですが、特にforループのシングルバイト読み込みでバッファを記述することなくそこに立つことは望ましくありませんでした。プログラマーとしての威力は2で、迷信です。 –

関連する問題