[英]System.out.err & System.out interleaving in Java
為了計算執行算法需要多少時間,我在 main 方法中執行此操作,但它不會打印時間,因為它與 System.print 交錯。
long startTime = System.currentTimeMillis();
A1.Print(2);
long endTime = System.currentTimeMillis();
System.err.print(endTime - startTime);
如果 A 類是這樣的:
public class A{
public void Print(int n){
for(int i = 0; i <=n; i++){
System.out.println(i)
}
}
它打印
0
1
2
在這一行中,它是應該通過該循環的時間量,但它根本不會,所以它不會像這樣打印:
0
1
2
1
這里的最后一行或 1 是算法所用的毫秒數。 教科書說你必須使用 System.err。 並找出防止交錯的方法。
你可以做一些像
System.setErr(System.out);
所以輸出在同一個流中。 他們使用兩個不同的流,所以這就是為什么你要交錯。
對於您的代碼,它將是:
long startTime = System.currentTimeMillis();
System.setErr(System.out);
A1.Print(50);
long endTime = System.currentTimeMillis();
System.err.print(endTime - startTime);
System.err
和System.out
使用不同的緩沖區(取決於操作系統),因此這些緩沖區可能會在不同的時間被刷新。 因此可能會產生交錯輸出。
而且,System.err 不能保證默認定向到控制台(與 System.out 不同),它可能鏈接到控制台或文件系統。
要解決此問題,您可能希望System.err
鏈接到System.out
喜歡
System.setErr(System.out);
或者
System.setErr(System.console());
如果您在 Eclipse 中,這是一個已知錯誤: https : //bugs.eclipse.org/bugs/show_bug.cgi?id=32205 。 從命令行嘗試相同的
您可能應該使用System.err.println
而不是System.err.print
。 它可能只是在緩沖,直到它得到一整行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.