过去几天这一直困扰着我,因为它过去常常起作用。我升级了我的intellij,现在它不起作用。我不想回去,但我需要一个答案。
所以,我正在编写一个控制台应用程序,当它运行时,我想要显示进度的shell。它在运行时工作正常,但是当我在IntelliJ Idea中调试时,除非缓冲区包含换行符,否则System.out.flush()不会刷新到控制台。我编写了以下单元测试,以确定它是我还是我的应用程序。
@Test
public void flushTest() {
int loops = 100;
for (int i = 0 ; i < 100 ; ++i) {
System.out.print("This is a print, does it flush : " + i + "\r");
if (i %10 == 0) {
System.out.print("\n");
}
System.out.flush();
}
}
Spoiler,它是应用程序。我不知道发生了什么变化,但是如果没有在命令行上进行完整构建和运行,就很难调试显示问题。如果有人可以帮我弄清楚为什么这会改变和/或帮助我修复它所以它会正确冲洗,我会非常感激。
答案 0 :(得分:5)
在2016.3.5版本上测试过,问题仍然存在。
该错误是由之后的所有字符&#34; \ r&#34;将在控制台中清除。
例如,使用字符串&#34; Test \ r&#34;将得到&#34;测试&#34;写入控制台后,光标由&#34; \ r&#34;向左移动,所有字符&#34;测试&#34;被清除了。所以你什么也看不见。
解决方法是移动&#34; \ r&#34;到字符串的开头。例如,&#34; \ rTest&#34;将在控制台中看到输出。
以下代码将说明错误。你会看到&#34; 0000&#34;和&#34; 111&#34;将出现1秒钟,然后全部由&#34; 22&#34;。
清除System.out.print("0000\r");
Thread.sleep(1000);
System.out.print("111\r");
Thread.sleep(1000);
System.out.print("22\r");
答案 1 :(得分:1)
在此issue未解决之前,请使用当前的解决方法
-Deditable.java.test.console=true
(在idea.properties
中指定)。