package crate.elasticsearch.export; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; /** * A stream consumer to consume the output of an input stream. */ public class StreamConsumer { private final StreamConsumerImpl impl; private Thread thread; /** * Constructor. * * @param inputStream the input stream to consume * @param bufferSize the buffer size to keep (first x bytes) */ public StreamConsumer(InputStream inputStream, int bufferSize) { impl = new StreamConsumerImpl(inputStream, bufferSize); thread = new Thread(impl); thread.start(); } /** * Get the buffered output of the stream (first x bytes defined * in buffer size) * @return */ public String getBufferedOutput() { return impl.getOutput(); } /** * Wait for the stream to finish. */ public void waitFor() { try { thread.join(); } catch (InterruptedException e) { e.printStackTrace(); } } /** * Implementation class for thread. */ private final class StreamConsumerImpl implements Runnable { private final int bufferSize; private final StringBuffer collectedOutput = new StringBuffer(); private InputStream inputStream; private StreamConsumerImpl(InputStream inputStream, int bufferSize) { this.bufferSize = bufferSize; this.inputStream = inputStream; } public void run() { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader( inputStream)); String line; try { do { line = bufferedReader.readLine(); if (line != null && collectedOutput.length() < bufferSize) { collectedOutput.append(line + "\n"); } } while (line != null); } catch (IOException e) { e.printStackTrace(); } finally { try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } private String getOutput() { return collectedOutput.toString(); } } }