core/src/main/java/com/twitter/elephantbird/util/StreamSearcher.java
public long search(InputStream stream) throws IOException {
    long bytesRead = 0;

    int b;
    int j = 0;

    while ((b = stream.read()) != -1) {
      bytesRead++;

      while (j >= 0 && (byte)b != pattern_[j]) {
        j = borders_[j];
      }
      // Move to the next character in the pattern.
      ++j;

      // If we've matched up to the full pattern length, we found it.  Return,
      // which will automatically save our position in the InputStream at the point immediately
      // following the pattern match.
      if (j == pattern_.length) {
        return bytesRead;
      }
    }

    // No dice, Note that the stream is now completely consumed.
    return -1;
  }
public long search(InputStream stream) throws IOException {
    long bytesRead = 0;

    int b;
    int j = 0;

    while ((b = stream.read()) != -1) {
      bytesRead++;

      while (j >= 0 && (byte)b != pattern_[j]) {
        j = borders_[j];
      }
      // Move to the next character in the pattern.
      ++j;

      // If we've matched up to the full pattern length, we found it.  Return,
      // which will automatically save our position in the InputStream at the point immediately
      // following the pattern match.
      if (j == pattern_.length) {
        return bytesRead;
      }
    }

    // No dice, Note that the stream is now completely consumed.
    return -1;
  }
public long search ( InputStream stream ) throws IOException { long bytesRead = 0 ; int b ; int j = 0 ; while ( ( b = stream . read ( ) ) != - 1 ) { bytesRead ++ ; while ( j >= 0 && ( byte ) b != pattern_ [ j ] ) { j = borders_ [ j ] ; } // Move to the next character in the pattern. ++ j ; // If we've matched up to the full pattern length, we found it.  Return, // which will automatically save our position in the InputStream at the point immediately // following the pattern match. if ( j == pattern_ . length ) { return bytesRead ; } } // No dice, Note that the stream is now completely consumed. return - 1 ; }
Searches for the next occurrence of the pattern in the stream, starting from the current stream position. Note
that the position of the stream is changed. If a match is found, the stream points to the end of the match -- i.e. the
byte AFTER the pattern. Else, the stream is entirely consumed. The latter is because InputStream semantics make it difficult to have
another reasonable default, i.e. leave the stream unchanged.

@return bytes consumed if found, -1 otherwise.
@throws IOException
Searches for the next occurrence of the pattern in the stream starting from the current stream position . Note that the position of the stream is changed . If a match is found the stream points to the end of the match -- i . e . the byte AFTER the pattern . Else the stream is entirely consumed . The latter is because InputStream semantics make it difficult to have another reasonable default i . e . leave the stream unchanged .