簡體   English   中英

Java 中的 System.out.err 和 System.out 交錯

[英]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.errSystem.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM