[英]“BufferedReader.ready” vs. “while(BufferedReader.readLine()!=null)”
我是 java 的新手。 我想從 java 開始的進程中讀取標准輸出。 我通過谷歌搜索得到以下代碼:
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec(args);
BufferedReader br = new BufferedReader(
new InputStreamReader(proc.getInputStream()));
while(br.ready()){
System.out.println(br.readLine());
}
但是,此代碼不會打印該過程(例如 ls)應該產生的 output(順便說一句,我在 Linux,openJDK 1.6)
但是,如果我將 while 循環更改為:
String line;
while((line = br.readLine())!=null){
System.out.println(line);
}
它按預期工作。
之前的代碼有什么問題? 根據 java api 文檔所說的,我認為它們是相似的。
在前面的循環中,您只是在准備好的 state 上循環,而不是從 stream 讀取任何字節。
當您到達ready()
測試時,該命令尚未產生任何 output 並且它返回false
,立即結束循環。
您的第二個代碼有效,因為readLine()
調用會阻塞,直到它讀取整行。 如果沒有進一步的控制,這種代碼的 output 是不可預測的,因為它取決於命令產生的 output 的數量和完成所需的時間。
這是一個非常簡單的場景,因此它在大多數情況下都有效,但它不是一個通常可以應用的解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.