[英]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。 下面是我得到的隨機輸出
Finally is executed.File stream is closed.
this is a text file
and a java program will read this file.
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.