如何从标准输入读取非阻塞?

时间:2011-10-24 08:16:32

标签: java

    long end=System.currentTimeMillis()+60*10;
    InputStreamReader fileInputStream=new InputStreamReader(System.in);
    BufferedReader bufferedReader=new BufferedReader(fileInputStream);
    try
    {
        while((System.currentTimeMillis()<end) && (bufferedReader.readLine()!=null))
        {

        }
        bufferedReader.close();
    }
    catch(java.io.IOException e)
    {
        e.printStackTrace();
    }

我实际上尝试在600毫秒的时间内完成上述操作,之后它不应该允许读取但缓冲读取器的读取线是阻塞的。请帮助

4 个答案:

答案 0 :(得分:3)

您可以查看BufferedReader.available()&gt;如果有要读取的字符,则为0。

String s;

while((System.currentTimeMillis()<end))
{
    if (bufferedReader.available() > 0)
        s += bufferedReader.readLine();
}

bufferedReader.close();

答案 1 :(得分:2)

long end=System.currentTimeMillis()+60*10;
InputStreamReader fileInputStream = new InputStreamReader(System.in);
BufferedReader bufferedReader = new BufferedReader(fileInputStream);
try {
    while ((System.currentTimeMillis() < end)) {
        if (bufferedReader.ready()) {
            System.out.println(bufferedReader.readLine());
        }
    }
} catch (IOException e) {
    e.printStackTrace();
} finally {
    try {
        if (bufferedReader != null) {
            bufferedReader.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

答案 2 :(得分:1)

唯一可靠的方法是启动一个工作线程并在其中进行实际读取,而调用者线程将监视延迟。

如果工作线程等待的时间超过允许的范围,主线程将终止它并抛出异常。

答案 3 :(得分:0)

如果一行非常长,就像1M字符一样,

BufferReader.readLine()可以阻塞很长时间。

你的文件是否包含这么长的行?

如果是,您可能需要拆分行,或者使用像BufferReader.read()这样的per-char读取方法。