/******************************************************************************* * Copyright (c) 2010 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is made available under the terms of the * Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.usage.util.reader; import java.io.CharArrayWriter; import java.io.IOException; import java.io.Reader; import java.io.Writer; /** * @author Andre Dietisheim */ public class ReaderUtils { /** * Reads from the given input stream until a signal is found. The signal * itself is not appended to the string that is returned. * <p> * This method does not read any further as the maximum number of bytes * given and the end of the stream is reached. If the signal's not found * <tt>null</tt> is returned. * * @param signal * the signal * @param maxRead * the max number of bytes to read * @param reader * the reader * @return the string that holds the bytes read * @throws Exception */ public static String readStringUntil(Reader reader, char... signal) throws IOException { Writer writer = new CharArrayWriter(); AppendUntilImpl visitor = new AppendUntilImpl(reader, writer, signal); try { visitor.read(); if (!visitor.isMatching() || visitor.getNumOfWrittenCharacters() == 0) { return null; } writer.flush(); return writer.toString(); } finally { writer.close(); } } public static String readStringUntil(Reader reader, String signal) throws IOException { return readStringUntil(reader, signal.toCharArray()); } public static String readStringUntil(Reader reader, String... alternatives) throws IOException { Writer writer = new CharArrayWriter(); AppendUntilAlternativeImpl visitor = new AppendUntilAlternativeImpl(reader, writer, alternatives); try { visitor.read(); if (!visitor.isMatching() || visitor.getNumOfWrittenCharacters() == 0) { return null; } writer.flush(); return writer.toString(); } finally { writer.close(); } } /** * Skips the characters in the given reader until one of the given * alternatives is found. * * @param maxRead * the max number of characters to read * @param reader * the reader to read from * @param alternatives * the strings to find (alternatively) in the reader * @return the index of the alternative that was found or <tt>-1</tt> if * none was found * @throws IOException * Signals that an I/O exception has occurred. */ public static String skipUntil(Reader reader, String... alternatives) throws IOException { ReadUntilAlternativesImpl visitor = new ReadUntilAlternativesImpl(reader, alternatives); visitor.read(); return visitor.getAlternative(); } }