【问题标题】:BufferedReader, detecting if there is text left to readBufferedReader,检测是否还有文本要读取
【发布时间】:2012-11-15 18:38:32
【问题描述】:

我正在运行一个线程,每次它运行时,它都应该检查是否有新的行可以从 BufferedReader 读取,尽管它在等待一行存在时卡住了,从而停止了整个代码.

if((inputLine = bufferedReader.readLine()) != null){
                System.out.println(inputLine);
                JOptionPane.showMessageDialog(null, inputLine);
}

有没有办法更好地检查BufferedReader 中是否有文本可供阅读?

【问题讨论】:

  • 为什么?如果没有数据,它将阻塞。你还打算做什么?
  • 你试过BufferedReader#ready()docs.oracle.com/javase/6/docs/api/java/io/…吗?
  • 我认为ready() 不会满足这种需求。 ready() 会告诉他缓冲区中是否有东西;它不会告诉他是否有整行要阅读。 readLine() 还是会进入等待状态吧?
  • 已修复,谢谢各位

标签: java bufferedreader java-io


【解决方案1】:

不,没有简单的方法可以做到这一点。 BufferedReader 有一个ready 调用,但这仅适用于read 调用,而不适用于readLine 调用。如果您真的想要一个保证不会阻塞的readLine,您必须使用read 自己实现它并自己维护一个char 缓冲区。

【讨论】:

  • 所以如果我做 ready() 如果那里没有文字会跳过它? readlLine 只是为了让我可以使用空格。
【解决方案2】:

readLine 方法将阻塞,除非它可以读取整行(由行终止字符分隔),或已到达输入结尾:

http://docs.oracle.com/javase/6/docs/api/java/io/BufferedReader.html#readLine()

您描述的情况是尚未到达输入的末尾,但缓冲区中没有足够的字符来构成“行”(即以行终止符结尾的一系列字符) .

为此,您必须低于readLine 级别,可能是流级别本身。 InputStream 有一个名为 available() 的方法,可以满足您的需求。

【讨论】:

    【解决方案3】:

    你为什么不先检查一下它是否可以被阅读?只需使用bufferedReader.ready()

    编辑:

    ready 不会告诉你是否准备好了一行,它只会告诉你有东西要读。但是,如果您希望得到一条线,那么这对您有用。想法是,首先检查它是否准备好,然后读取该行,这样当绝对没有可读取的内容时,线程就不会挂在那里。

    【讨论】:

    • ready() 将返回 truereadLine() 可能仍会阻塞,如果缓冲区包含的字符都不是行终止符。
    • 一般来说是不可靠的(允许给出假阴性),而且无论如何,只检查是否有至少一个字符可用,而不是一整行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    • 2013-04-12
    • 2017-03-20
    • 2019-04-12
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多