簡體   English   中英

System.out和System.err調用的隨機打印順序

[英]Random printing order for System.out & System.err calls

請參閱下面的代碼段

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class ReadFile {


    public static void main(String[] args)  {

        String str="";
        FileReader fileReader=null;

        try{


            // I am running on windows only  & hence the path :) 
            File file=new File("D:\\Users\\jenco\\Desktop\\readme.txt");
            fileReader=new FileReader(file);
            BufferedReader bufferedReader=new BufferedReader(fileReader);
            while((str=bufferedReader.readLine())!=null){
                System.err.println(str);
            }

        }catch(Exception exception){
            System.err.println("Error occured while reading the file : " + exception.getMessage());
            exception.printStackTrace();
        }
        finally {
            if (fileReader != null) {
                try {
                    fileReader.close();
                    System.out.println("Finally is executed.File stream is closed.");
                } catch (IOException ioException) {

                    ioException.printStackTrace();
                }
            }
        }

    }

}

當我多次執行代碼時,我會隨機輸出如下所示,有時System.out語句首先在控制台中打印,有時會先打印System.err。 下面是我得到的隨機輸出

輸出1

Finally is executed.File stream is closed.
this is a text file 
and a java program will read this file.

輸出2

this is a text file 
and a java program will read this file.
Finally is executed.File stream is closed.

為什么會這樣?

我相信這是因為你正在寫兩個不同的輸出(一個是標准輸出,另一個是標准錯誤)。 這些可能在運行時由兩個不同的線程處理,以允許在Java執行期間寫入兩者。 假設是這種情況,cpu任務調度程序不會每次都以相同的順序執行線程。

如果所有輸出都轉到相同的輸出流(即所有輸出都標准輸出或一切都符合標准錯誤),則永遠不應該獲得此功能。 永遠不會保證標准錯誤與標准輸出的執行順序。

因為System.out和System.err都指向您的控制台。

為了演示,如果在println()之后添加System.out.flush()和System.err.flush(),那么輸出將是一致的。

這已在這里得到解答:

Java:System.out.println和System.err.println亂序

發生這種情況是因為您的finally子句正在使用System.out而其他代碼正在使用System.err。 錯誤的流在流出之前刷新,反之亦然。

因此,打印數據的順序將不會保證與調用的順序相同。

您始終可以讓控制台將錯誤的流指向文件,或將流指向文件以供以后檢查。 或者,更改代碼以將所有內容打印到System.out。 許多程序員不使用err,除非你從控制台中分離出錯誤,否則它的用處是有爭議的。

用完了!

完了,走吧...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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