如果您使用System.err.print("There was an error..."); System.error.flush();
,您需要事先刷新System.out
。我知道使用System.out.print("bla");
和System.error.print("bla");
进行写作会导致未刷新的流混淆。
我假设您只需要知道没有System.out.println();
或System.out.print("\n");
,因为"\n"
会自动刷新{{} 1}},但我只想确定。
另外,请不要在评论中说出"为什么你不测试它?"因为你有点难以测试这个,因为你实际上是依靠运气来看看溪流是否不能正常冲洗。
谢谢!
答案:
如果没有例外,我想只使用java.lang.System
。
-
如果你不相信我那个sout和serr混在一起......
证明(我刚刚上课):
Logger.getLogger(Your_Class.class.getName()).log(Level.WHATEVER, "message");
输出:
package test;
/**
*
* @author dylnmc
*/
public class Test {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
for (int i = 0; i < 20; i++) {
if (i % 2 == 0) {
System.out.println(i);
} else {
System.err.println(i);
}
}
}
}
如果你将Test.java变成jar并运行run:
0
1
3
2
4
6
8
10
12
14
16
18
5
7
9
11
13
15
17
19
BUILD SUCCESSFUL (total time: 0 seconds)
java -jar file/to/jar/Test.jar
,那么就没有错误了 - 正如有些人所说的那样(因为这是大多数ide控制台中的一个问题)。
-
-
另外,我仍然可以不让两个不同的流在Netbeans ide中刷新;他们仍然到处都是。
答案 0 :(得分:0)
System.out
和System.err
是两种不同的数据流。写一个通常不会改变另一个。像Netbeans或Eclipse这样的IDE会同时读出和错误的流,并同时在控制台窗口中显示。从错误流中读取的数据可能会以红色突出显示。这使得输出看起来“混淆”了。
因此,System.out.flush()不会对System.err产生任何影响。相反,您可以考虑使用System.setOut,System.setErr将System.out重定向到单独的流,并在退出程序之前打印捕获的数据。
答案 1 :(得分:0)
System.out.println(String s)和System.err.println(String s)不是原子操作,因为它们首先打印字符串,然后打印换行符。原子性是相对的。这两个操作(打印字符串并打印换行符)位于同步块中,因此从Java代码的角度来看它们是原子的。但是,它们仍然是底层系统的两个独立操作。因此,如果控制台由err和out共享,则使用以下代码:
System.out.println("abc");
System.out.println("def");
最终将导致&#34; abc&#34;,&#34; \ n&#34;,&#34; def&#34;,&#34; \ n&#34;以可能不正确的顺序打印。第一个换行将始终打印在&#34; abc&#34;之后,第二个换行将始终打印在&#34; def&#34; (由于同步)但序列&#34; abc&#34;,&#34; def&#34; &#34; \ n&#34;,&#34; \ n&#34;是可能的。
为避免这种情况,请避免使用println:
System.out.print("abc" + "\n");
System.out.print("def" + "\n");
(当然,您应该为系统使用正确的行分隔符。)