code: 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;
    }
docs: 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