public static boolean failFast(RandomAccessFile raf) throws IOException { return !raf.searchForward(matcher, 1000); // look in first 1K }
public static boolean failFast(RandomAccessFile raf) throws IOException { raf.seek(0); boolean ok = raf.searchForward(matchDSET, 1000); // look in first 1K if (!ok) { raf.seek(0); ok = raf.searchForward(matchdset, 1000); // look in first 1K if (!ok) return true; } long pos = raf.getFilePointer(); ok = raf.searchForward(matchENDVARS, 20000); // look in next 20K if (!ok) { raf.seek(pos); ok = raf.searchForward(matchendvars, 20000); // look in next 20K } return !ok; }
public static void main2(String[] args) throws IOException { String filename = (args.length > 0 && args[0] != null) ? args[0] : "Q:/cdmUnitTest/formats/grib2/LMPEF_CLM_050518_1200.grb"; System.out.printf("Scan %s%n", filename); try (RandomAccessFile raf = new RandomAccessFile(filename, "r")) { raf.seek(0); while (!raf.isAtEndOfFile()) { boolean found = raf.searchForward(matcher, -1); if (found) { raf.skipBytes(7); // will be positioned on byte 0 of indicator section int edition = raf.read(); // read at byte 8 System.out.printf(" GRIB edition %d found at pos %d%n", edition, raf.getFilePointer()); break; } } } catch (IOException e) { e.printStackTrace(); } }
public boolean hasNext() throws IOException { if (lastPos >= raf.length()) return false; raf.seek(lastPos); boolean more = raf.searchForward(matcher, -1); // will scan to end for another BUFR header if (more) { long stop = raf.getFilePointer(); int sizeHeader = (int) (stop - lastPos); if (sizeHeader > 30) sizeHeader = 30; header = new byte[sizeHeader]; startPos = stop-sizeHeader; raf.seek(startPos); int nRead = raf.read(header); if (nRead != header.length) { log.warn("Unable to read full BUFR header. Got " + nRead + " but expected " + header.length); return false; } } if (debug && countMsgs % 100 == 0) System.out.printf("%d ", countMsgs); return more; }
/** * returns Grib file type, 1 or 2, or 0 not a Grib file. * * @return GribFileType * @throws IOException on data read * @throws NotSupportedException NotSupportedException */ public final int getEdition() throws IOException { raf.seek(0); if (!raf.searchForward(matcher, 8000)) return 0; // must find "GRIB" in first 8k raf.skipBytes(4); // Read Section 0 Indicator Section to get Edition number Grib2IndicatorSection is = new Grib2IndicatorSection(raf); // section 0 return is.getGribEdition(); }
public boolean hasNext() throws IOException { if (lastPos >= raf.length()) return false; raf.seek(lastPos); boolean more = raf.searchForward(matcher, -1); // will scan to end for another BUFR header if (more) { long stop = raf.getFilePointer(); int sizeHeader = (int) (stop - lastPos); if (sizeHeader > 30) sizeHeader = 30; header = new byte[sizeHeader]; startPos = stop-sizeHeader; raf.seek(startPos); raf.read(header); } // System.out.println(" more "+more+" at "+startPos+" lastPos "+ lastPos+" nbytes= "+nbytes+ " msg "+countMsgs); return more; }
static public boolean isValidFile(RandomAccessFile raf) throws IOException { raf.seek(0); if (!raf.searchForward(matcher, 8000)) return false; // must find "GRIB" in first 8k raf.skipBytes(4); // Read Section 0 Indicator Section to get Edition number Grib2IndicatorSection is = new Grib2IndicatorSection(raf); // section 0 if (is.getGribEdition() != 1 && is.getGribEdition() != 2) return false; if (is.getGribLength() > raf.length()) return false; return true; }
/** * is this a valid BUFR file. * * @param raf check this file * @return true if its a BUFR file * @throws IOException on read error */ static public boolean isValidFile(ucar.unidata.io.RandomAccessFile raf) throws IOException { raf.seek(0); if (!raf.searchForward(matcher, 40 * 1000)) return false; // must find "BUFR" in first 40k raf.skipBytes(4); BufrIndicatorSection is = new BufrIndicatorSection(raf); if (is.getBufrEdition() > 4) return false; // if(is.getBufrLength() > MAX_MESSAGE_SIZE) return false; return !(is.getBufrLength() > raf.length()); }
/** * is this a valid BUFR file. * * @param raf check this file * @return true if its a BUFR file * @throws IOException on read error */ static public boolean isValidFile(ucar.unidata.io.RandomAccessFile raf) throws IOException { raf.seek(0); if (!raf.searchForward(matcher, 8000)) return false; // must find "BUFR" in first 8k raf.skipBytes(4); BufrIndicatorSection is = new BufrIndicatorSection(raf); if (is.getBufrEdition() > 4) return false; // if(is.getBufrLength() > MAX_MESSAGE_SIZE) return false; if (is.getBufrLength() > raf.length()) return false; return true; }
static public boolean isValidFile(RandomAccessFile raf) { try { raf.seek(0); 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 false; // check ending = 7777 long len = GribNumbers.int8(raf); if (len > raf.length()) return false; raf.skipBytes(len-20); for (int i = 0; i < 4; i++) { if (raf.read() != 55) return false; } return true; } catch (IOException e) { return false; } }
static public boolean isValidFile(RandomAccessFile raf) { try { raf.seek(0); boolean found = raf.searchForward(matcher, maxScan); // look in first 16K if (!found) return false; raf.skipBytes(4); // will be positioned on byte 0 of indicator section int len = GribNumbers.uint3(raf); int edition = raf.read(); // read at byte 8 if (edition != 1) return false; /* Due to a trick done by ECMWF's GRIBEX to support large GRIBs, we need a special treatment * to fix the length of the GRIB message. See: * https://software.ecmwf.int/wiki/display/EMOS/Changes+in+cycle+000281 * https://github.com/Unidata/thredds/issues/445 */ len = getFixedTotalLengthEcmwfLargeGrib(raf,len); // check ending = 7777 if (len > raf.length()) return false; if (allowBadIsLength) return true; raf.skipBytes(len-12); for (int i = 0; i < 4; i++) { if (raf.read() != 55) return false; } return true; } catch (IOException e) { return false; } }
more = raf.searchForward(matcher, -1); // will scan to end for a 'GRIB' string if (!more) break;
public boolean hasNext() throws IOException { if (lastPos >= raf.length()) return false; boolean more; long foundAt = 0; while (true) { // scan until we get a GRIB-1 or more is false raf.seek(lastPos); more = raf.searchForward(matcher, -1); // will scan to end for a 'GRIB' string if (!more) break; foundAt = raf.getFilePointer(); // see if its GRIB-1 raf.skipBytes(7); int edition = raf.read(); if (edition == 1) break; lastPos = raf.getFilePointer(); // not edition 1 ! could terminate ?? } if (more) { // read the header - stuff between the records int sizeHeader = (int) (foundAt - lastPos); if (sizeHeader > 100) sizeHeader = 100; // maximum 100 bytes, more likely to be garbage long startPos = foundAt-sizeHeader; header = new byte[sizeHeader]; raf.seek(startPos); raf.readFully(header); raf.seek(foundAt); this.lastPos = foundAt; // ok start from here next time } return more; }