2 lhs472194266 lhs472194266 于 2015.06.11 15:22 提问

关于system.in输入流 问题!

如图所示!如果是读取文件,当读到文件末尾条件等于null,退出循环。。而这里如果不输入内容,那程序是在哪里阻塞着???为什么??它不是应该一直readline吗??图片图片

4个回答

tongyi55555
tongyi55555   2015.06.11 16:40
已采纳

是这一句阻塞了。

str=br.readLine(); 

你输入完毕后,会进入第二次等待输入状态。
在BufferedReader中有个方法叫fill方法,会一直监听控制台输入,可以具体的看一下。

lhs472194266
lhs472194266 没找到fill介个方法阿!!!
2 年多之前 回复
tongyi55555
tongyi55555   2015.06.11 15:46

你发的图看不清楚啊,分辨率太小了。

lhs472194266
lhs472194266 import java.io.*;public class Test02 { public static void main(String[] args){ BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); String str; try { while ((str = br.readLine()) != null) { System.out.println(str); } } catch (IOException e) {} } }
2 年多之前 回复
tongyi55555
tongyi55555   2015.06.11 21:11

在java.io.BufferedReader中有这个方法。下面是这个方法的介绍,你可以看看。是不是你的JDK没有源码啊?


    /**
     * Fills the input buffer, taking the mark into account if it is valid.
     */
    private void fill() throws IOException {
    int dst;
    if (markedChar <= UNMARKED) {
        /* No mark */
        dst = 0;
    } else {
        /* Marked */
        int delta = nextChar - markedChar;
        if (delta >= readAheadLimit) {
        /* Gone past read-ahead limit: Invalidate mark */
        markedChar = INVALIDATED;
        readAheadLimit = 0;
        dst = 0;
        } else {
        if (readAheadLimit <= cb.length) {
            /* Shuffle in the current buffer */
            System.arraycopy(cb, markedChar, cb, 0, delta);
            markedChar = 0;
            dst = delta;
        } else {
            /* Reallocate buffer to accommodate read-ahead limit */
            char ncb[] = new char[readAheadLimit];
            System.arraycopy(cb, markedChar, ncb, 0, delta);
            cb = ncb;
            markedChar = 0;
            dst = delta;
        }
                nextChar = nChars = delta;
        }
    }

    int n;
    do {
        n = in.read(cb, dst, cb.length - dst);
    } while (n == 0);
    if (n > 0) {
        nChars = dst + n;
        nextChar = dst;
    }
    }
frank_20080215
frank_20080215   2015.06.11 22:24

While(!EOF){
readline(...);
}
伪代码,仅供参考

Csdn user default icon
上传中...
上传图片
插入图片