簡體   English   中英

“BufferedReader.ready”與“while(BufferedReader.readLine()!=null)”

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

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