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

标签 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 毫秒的时间内执行上述读取操作,之后它不应允许读取,但 bufferedreader 的 readline 正在阻塞。请帮忙

最佳答案

按照 Sibbo 的建议使用 BufferedReader.available() 并不可靠。 available() 的文档说明:

Returns an estimate of the number of bytes that can be read... It is never correct to use the return value of this method to allocate a buffer.

换句话说,您不能依赖此值,例如,即使某些字符实际上可用,它也可以返回 0

我做了一些研究,除非您能够从外部关闭进程输入流,否则您需要求助于来自不同线程的异步读取。您可以找到一个示例,说明如何在不阻塞的情况下逐行阅读 here .


更新:这是来自上面链接的代码的简化版本:

public class NonblockingBufferedReader {
    private final BlockingQueue<String> lines = new LinkedBlockingQueue<String>();
    private volatile boolean closed = false;
    private Thread backgroundReaderThread = null;

    public NonblockingBufferedReader(final BufferedReader bufferedReader) {
        backgroundReaderThread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    while (!Thread.interrupted()) {
                        String line = bufferedReader.readLine();
                        if (line == null) {
                            break;
                        }
                        lines.add(line);
                    }
                } catch (IOException e) {
                    throw new RuntimeException(e);
                } finally {
                    closed = true;
                }
            }
        });
        backgroundReaderThread.setDaemon(true);
        backgroundReaderThread.start();
    }

    public String readLine() throws IOException {
        try {
            return closed && lines.isEmpty() ? null : lines.poll(500L, TimeUnit.MILLISECONDS);
        } catch (InterruptedException e) {
            throw new IOException("The BackgroundReaderThread was interrupted!", e);
        }
    }

    public void close() {
        if (backgroundReaderThread != null) {
            backgroundReaderThread.interrupt();
            backgroundReaderThread = null;
        }
    }
}

关于java - 如何从标准输入非阻塞读取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7872846/

相关文章:

java - 文件内的耳朵编码

java - Ant Sonar 将多个报告合并为一个

java - Android 应用程序崩溃并出现错误 java.lang.RuntimeException : Unable to instantiate activity ComponentInfo

java - 不使用线程的异步数据库写入

java - 带有访问者类的空指针

java - 如何使用 JpaRepository 和嵌套的对象列表进行搜索?

java - 如何编写Java代码让JPA/hibernate知道在哪里寻找配置文件?

java - 是否可以为 @Scheduled 分配代表 "never"的句点(在 Spring 中)?

java - 使用 serialVersionUID 还是禁止警告?

java - 如何从Java中的单词中删除重复的字母