public static boolean isValidFile(RandomAccessFile raf) { try { raf.seek(0); while (raf.getFilePointer() < maxScan) { boolean found = raf.searchForward(matcher, maxScan); // look in first 16K if (!found) return false; raf.skipBytes(7); // will be positioned on byte 0 of indicator section int edition = raf.read(); // read at byte 8 if (edition == 2) return true; } } catch (IOException e) { return false; } return false; }
public boolean hasNext() throws IOException { if (lastPos >= raf.length()) return false; if (repeatPos > 0) { if (nextRepeating()) // this has created a new repeatRecord return true; } else { repeatRecord = null; repeatBms = null; // fall through to new record } boolean more; long stop = 0; while (true) { // scan until we get a GRIB-2 or more == false raf.seek(lastPos); more = raf.searchForward(matcher, -1); // will scan to end for a 'GRIB' string if (!more) break; stop = raf.getFilePointer(); // see if its GRIB-2 raf.skipBytes(7); int edition = raf.read(); if (edition == 2) break; lastPos = raf.getFilePointer(); // not edition 2 ! just skip it !! } if (more) { int sizeHeader = (int) (stop - lastPos); // wmo headers are embedded between records in some idd streams // if (sizeHeader > 30) sizeHeader = 30; header = new byte[sizeHeader]; startPos = stop - sizeHeader; raf.seek(startPos); raf.read(header); } if (debug) System.out.println(" more " + more + " at " + startPos + " lastPos " + lastPos); return more; }