2013-06-26 5 views
0
  • У меня есть файл GB двоичных данных.
  • В этом файле много разделов данных.
  • Каждый раздел данных обернут в дерьмо, которое я не хочу.
  • В дерьме, что я не хочу, есть постоянные указатели, которые говорят мне, когда данные приближаются.
  • Я прочитал несколько байтов, прочитал дерьмо, которое я не хочу, чтобы найти раздел данных, а затем разобрать только данные в выходной файл.

До сих пор я достиг этого. Кроме того, он анализирует только один раздел, затем останавливается. Программа все еще работает, и выходной файл имеет только один раздел проанализированных данных. Так что он повесил трубку. Мне нужно, чтобы программа продолжалась с последнего раздела, ища следующий маркер, а затем проанализируйте следующий раздел и продолжайте делать это до тех пор, пока не будет. Вот мой код:Java, Parser только анализирует данные один раз. Необходимо проанализировать до eof

private static void startParse(File inFile) throws IOException{ 
boolean endOfFile = false; 
DataInputStream dis = new DataInputStream(new FileInputStream(inFile)); 
while (!endOfFile){ 
      try { 
      int integer; 
      long l; 
      while((l = (integer = dis.readInt())) != MARKER) { 
       //Don't do anything 
      } 
      for (int i = 0; i < 11; i++){ 
       dis.read(); 
      } 

    // ***************** checksum value ***************** 
      byte[] checksum = new byte[2]; 
      checksum[0] = (byte) dis.read(); 
      checksum[1] = (byte) dis.read(); 

    // ********************** data **********************   
      byte[] data = new byte[1016]; 
      for(int i = 0; i < 1016; i++){ 
       data[i] = (byte) dis.read(); 
      } 

      for (int i = 0; i < 4; i++){ 
       dis.read(); 
      } 

    // ********************** fecf ********************** 
      byte[] fecf = new byte[2]; 
      fecf[0] = (byte) dis.read(); 
      fecf[1] = (byte) dis.read(); 

    // ***************** output data ******************** 
      if (checksumCheck(checksum) && fecfCheck(fecf)){ 
       FileOutputStream output = new FileOutputStream("ParsedData", true); 
       try{ 
        output.write(data); 
       } 
       finally{ 
        output.close(); 
       } 
      } 
      else { 
       FileOutputStream output = new FileOutputStream("ParsedData", true); 
       try{ 
        output.write(36606); //TODO: Change value to bad data flag. 
       } 
       finally{ 
        output.close(); 
       } 
      } 

     }    
     catch (EOFException eof) { 
      System.out.println("catch"); 
      endOfFile = true; 
     } 
    } 
dis.close(); 
} 
+0

Вы открываете поток на каждой итерации. Вам нужно продолжать читать, где вы были. –

+0

Спасибо, я обновил это. Хотя он, кажется, выводит одни и те же данные снова и снова ... а не новые данные из следующего раздела. Есть идеи? –

ответ

1

dis.close() закроет лежащий FileInputStream, следовательно, вы только читать одну секцию. переместите DataInputStream открытым и закрытым за пределами цикла while (и поместите все ваши закрытые вызовы в окончательные блоки, пока вы на нем).

+0

Awesome. Теперь он выглядит синтаксически до конца файла. Только он выглядит как выводящий первый раздел данных несколько раз, а не в следующий раздел данных. Я обновил свой код с помощью dataInputStream dis = ... и dis.close() вне цикла while. –

+0

@johnstamos - в качестве дополнительной заметки 'dis.readFully (byte [])' значительно упростит ваш код. – jtahlborn

+0

@johnstamos - следующий шаг, вероятно, для перехода через код с помощью отладчика. на данный момент в коде ничего не кажется неуместным. – jtahlborn