2016-09-06 2 views
0

Я читаю данные из файла (на самом деле это трубка fifo).Java - чтение смешанных типов данных из файла (char + int + двоичный)

Формат выглядит следующим образом

SECTION_NAME 
SECTION_SIZE 
SECTION_DATA[SECTION_SIZE] 
..... 

Ex:

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 = новый байт [размер]; in.readFully (data); 'для завершения крикетной игры james. –

ответ

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% отлично читать байты в String. Из-за размера и преобразования это даже не желательно.

+0

Какое облегчение! Спасибо. Я сейчас пытаюсь это сделать. BDW в новом BufferedInputStream (fin, 2048); 2048 - максимальный размер общей секции .. не так ли? –

+0

2048 - размер буфера. Было бы неплохо, если бы раздел был прочитан с этим и не намного больше, но особенно я не хотел, чтобы мои однобайтовые чтения для цикла позволяли стоять там, не имея упомянутого буфера. И сила 2, поскольку мы, программисты, суеверны. –

Смежные вопросы