2013-06-26 54 views
0
  • 我有一個GB文件的二進制數據。
  • 在這個文件裏有很多數據的部分。
  • 數據的每一部分都被我不想要的廢話包裹起來。
  • 在我不想要的東西里有不斷的指示標記,告訴我數據何時出現。
  • 我讀了大量的字節,閱讀我不想要的東西,以便找到一段數據,然後僅將數據解析爲輸出文件。

到目前爲止,我已經完成了這一點。除了它只解析一次,一節,然後停止。該程序仍在運行,輸出文件中只有一段分析數據。所以它掛了。我需要程序繼續從上一節開始,尋找下一個標記,然後解析下一節並繼續這樣做直到eof。這裏是我的代碼:Java,Parser只解析數據一次。需要解析爲e

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循環之外打開和關閉(並將所有關閉的調用放在finally塊中)。

+0

太棒了。它現在看起來解析到文件的末尾。只有它看起來是重複輸出第一個數據部分,而不是下一個數據部分。我已經用while循環之外的dataInputStream dis = ...和dis.close()更新了我的代碼。 –

+0

@johnstamos - 作爲一個便箋,'dis.readFully(byte [])'可以大幅簡化您的代碼。 – jtahlborn

+0

@johnstamos - 下一步可能是使用調試器逐步完成代碼。代碼中的這一點似乎沒有什麼不合適之處。 – jtahlborn