java - BufferedReader.ready() 方法是否确保 readLine() 方法不返回 NULL?

标签 java file-io

我有这样的代码来使用 BufferedReader 读取文本文件:

BufferedReader reader=null;
    try {
        reader = new BufferedReader(new FileReader("file1.txt"));

        while (reader.ready()) {
            final String line = reader.readLine();
            System.out.println("<"+line+">");
        } catch (..)
    {
        ...
    }

它工作正常但 Findbugs 报告警告:

NP_DEREFERENCE_OF_READLINE_VALUE : The result of invoking readLine() is dereferenced without checking to see if the result is null. If there are no more lines of text to read, readLine() will return null and dereferencing that will generate a null pointer exception.

当我将 FileReader 更改为 StringReader 时,即

BufferedReader reader=null;
    try {
        reader = new BufferedReader(new StringReader("ABCD"));

        while (reader.ready()) {
            final String line = reader.readLine();
            System.out.println("<"+line+">");
        } catch (..)
    {
        ...
    }

readLine 方法返回 nullready 方法总是返回 true - 实际上这是一个无限循环.

这似乎是 readLine 可能会返回 null,即使 ready 返回 true。但为什么不同的 Reader 的行为不同呢?

更新:

我确实知道读取文本文件的正常方法(就像 Peter 和 Ali 所说明的那样)。但是我从同事那里读了那段代码,意识到我不知道 ready 方法。然后我阅读了 JavaDoc,但不理解 block。然后我做了一个测试并发布了这个问题。所以,提出这个问题的更好方式可能是:

什么时候输入会阻塞?如何使用 ready 方法(或者为什么不使用它)?为什么这 2 个 Reader(FileReaderStringReader)在 ready 方法方面的行为不同?

最佳答案

ready 方法告诉我们 Stream 是否准备好被读取。

假设您的流正在从网络套接字读取数据。在这种情况下,流可能还没有结束,因为套接字还没有关闭,但它可能还没有准备好接收下一个数据 block ,因为套接字的另一端没有推送任何更多数据。

在上面的场景中,在远程端推送数据之前,我们无法读取更多数据,因此我们必须等待数据可用,或者等待套接字关闭。 ready() 方法告诉我们数据何时可用。

关于java - BufferedReader.ready() 方法是否确保 readLine() 方法不返回 NULL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5244839/

相关文章:

java - java ftp代码中的问题

java - 为屏幕录像机创建 GUI

c++ - FILE_ATTRIBUTE_NORMAL 和 0 有什么区别?

c - 使用 fgets() 终止循环

c# - 在 ReadToEnd 之后关闭 StreamReader

android - 无法写入 SD 卡——canWrite 返回 false

java - JWrapper 示例应用程序无法在 Mac OS X 10.8.5 上启动

java - 约书亚布洛赫 #Item 1 : Consider static factory methods instead of constructors

java - python和java之间的IPC(进程间通信)

ruby - 我可以在后台写入文件吗?