package de.mxro.process.internal; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; public class StreamReader { private final class WorkerThread extends Thread { private final StreamListener listener; private final InputStream stream; private transient int timeout; private WorkerThread(final StreamListener listener, final InputStream stream) { this.listener = listener; this.stream = stream; this.timeout = 10; } @Override public void run() { final BufferedReader reader = new BufferedReader( new InputStreamReader(stream)); try { String read; this.timeout = 10; read = reader.readLine(); while (!stop && read != null && !read.trim().equals("--EOF--")) { if (stop) { stopReader(); return; } if (read != null) { listener.onOutputLine(read); } // waitForInput(); read = reader.readLine(); } } catch (final Exception e) { listener.onError(e); } } /** * Wait longer and longer to not keep CPU busy. */ private final void waitForInput() { try { Thread.sleep(this.timeout); } catch (final InterruptedException e) { throw new RuntimeException(); } if (this.timeout < 2000) { this.timeout = this.timeout + (this.timeout); } } private void stopReader() throws IOException { //stream.close(); stopped = true; listener.onClosed(); } } private final Thread t; private volatile boolean stop = false; private volatile boolean stopped = false; public void read() { t.run(); } public void stop() { if (stopped) { return; } stop = true; //while (!stopped) { // Thread.yield(); //} } public StreamReader(final InputStream stream, final StreamListener listener) { super(); this.t = new WorkerThread(listener, stream); } }