code: public void readNext(JCalDataStreamListener listener) throws IOException {
  		if (parser == null) {
  			JsonFactory factory = new JsonFactory();
  			parser = factory.createParser(reader);
  		}
  
  		if (parser.isClosed()) {
  			return;
  		}
  
  		this.listener = listener;
  
  		//find the next iCalendar object
  		JsonToken prev = parser.getCurrentToken();
  		JsonToken cur;
  		while ((cur = parser.nextToken()) != null) {
  			if (prev == JsonToken.START_ARRAY && cur == JsonToken.VALUE_STRING && VCALENDAR_COMPONENT_NAME.equals(parser.getValueAsString())) {
  				//found
  				break;
  			}
  
  			if (strict) {
  				//the parser was expecting the jCal to be there 
  				if (prev != JsonToken.START_ARRAY) {
  					throw new JCalParseException(JsonToken.START_ARRAY, prev);
  				}
  
  				if (cur != JsonToken.VALUE_STRING) {
  					throw new JCalParseException(JsonToken.VALUE_STRING, cur);
  				}
  
  				throw new JCalParseException("Invalid value for first token: expected \"vcalendar\" , was \"" + parser.getValueAsString() + "\"", JsonToken.VALUE_STRING, cur);
  			}
  
  			prev = cur;
  		}
  
  		if (cur == null) {
  			//EOF
  			eof = true;
  			return;
  		}
  
  		parseComponent(new ArrayList<String>());
  	}
docs: Reads the next iCalendar object from the jCal data stream.
  @param listener handles the iCalendar data as it is read off the wire
  @throws JCalParseException if the jCal syntax is incorrect (the JSON
  syntax may be valid, but it is not in the correct jCal format).
  @throws JsonParseException if the JSON syntax is incorrect
  @throws IOException if there is a problem reading from the data stream