Я знаю, что этот пост является древним, но он все еще является проблемой сегодня, поэтому здесь есть другое решение, которое решает проблему, используя ответ @ EserAygün, но таким образом, что вам не нужно искать и изменять каждое место в вашем проекте, где пишем System.out
или System.err
.
Создайте себе класс с именем EclipseTools
со следующим содержимым (а также требуемым объявлением пакета и импортом):
public class EclipseTools {
private static OutputStream lastStream = null;
private static boolean isFixed = false;
private static class FixedStream extends OutputStream {
private final OutputStream target;
public FixedStream(OutputStream originalStream) {
target = originalStream;
}
@Override
public void write(int b) throws IOException {
if (lastStream!=this) swap();
target.write(b);
}
@Override
public void write(byte[] b) throws IOException {
if (lastStream!=this) swap();
target.write(b);
}
@Override
public void write(byte[] b, int off, int len) throws IOException {
if (lastStream!=this) swap();
target.write(b, off, len);
}
private void swap() throws IOException {
if (lastStream!=null) {
lastStream.flush();
try { Thread.sleep(200); } catch (InterruptedException e) {}
}
lastStream = this;
}
@Override public void close() throws IOException { target.close(); }
@Override public void flush() throws IOException { target.flush(); }
}
/**
* Inserts a 200ms delay into the System.err or System.out OutputStreams
* every time the output switches from one to the other. This prevents
* the Eclipse console from showing the output of the two streams out of
* order. This function only needs to be called once.
*/
public static void fixConsole() {
if (isFixed) return;
isFixed = true;
System.setErr(new PrintStream(new FixedStream(System.err)));
System.setOut(new PrintStream(new FixedStream(System.out)));
}
}
Затем просто позвоните EclipseTools.fixConsole()
один раз в начале вашего кода. Проблема решена.
По сути, это заменяет два потока System.err
и System.out
настраиваемым набором потоков, которые просто перенаправляют свои данные в исходные потоки, но отслеживают, какой поток был записан в последний раз. Если поток, который записывается в изменения, например, System.err.something(...)
, за которым следует System.out.something(...)
, он сбрасывает вывод последнего потока и ждет 200 мс, чтобы дать консоли Eclipse время для завершения печати.
Примечание: 200 мс - это только приблизительное начальное значение. Если этот код уменьшает, но не устраняет проблему для вас, увеличьте задержку в Thread.sleep
с 200 до чего-то большего, пока он не заработает. В качестве альтернативы, если эта задержка работает, но влияет на производительность вашего кода (если вы часто чередуете потоки), вы можете постепенно уменьшать ее, пока не начнете получать ошибки.