【问题标题】:BufferedReader in Java is skipping the last empty line in fileJava中的BufferedReader正在跳过文件中的最后一个空行
【发布时间】:2022-01-20 05:44:56
【问题描述】:

我有一个格式如下的文件:

姓名:约翰
文字:你好
--empty line-- Buffered Reader 正在阅读此内容。
姓名:亚当
文字:嗨
--empty line-- Buffered Reader 正在跳过这一行。

我尝试了多种方法来读取最后一个空行,但它不起作用。有什么建议么? 我有一个程序可以验证消息的格式是否正确。 对于正确的格式,首先应该有三行名称,然后是文本和空行。 由于 BufferedReader 没有读取最后一个空行,所以我的程序总是说消息格式错误。

我正在使用的示例代码:

File file = new File(absolutePath);
FileReader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr);
String line;
while ((line = br.readLine()) != null) {
    process(line);
}

【问题讨论】:

  • 您需要编辑您的问题并添加您需要帮助的代码。
  • @tgdavies 用代码更新了问题
  • 你的意思是文件在“Text: Hi”之后以两个换行符结尾?还是只有一个换行符,后面什么都没有?如果是后者,那么这是按预期工作的,您的程序将需要适应这一点。

标签: java file bufferedreader filereader


【解决方案1】:

代码按预期的方式工作。最后(空)行是文件结尾(EOF)。有效行由回车和换行终止。因此,第 3 行被读取。我包含了一个显示文本和符号的文件图像(为此使用了 Notepad++)

如果我在末尾添加另一个空白行,请注意之前的空白行现在是如何终止的。

我稍微修改了你的代码来运行这个场景

    public static void main (String[] args) throws IOException {
        File file = new File("emptyline.txt");
        FileReader fr = new FileReader(file);
        BufferedReader br = new BufferedReader(fr);
        String line;
        int linenum = 1;
        while ( (line = br.readLine()) != null) {
            System.out.println("Line " + (linenum++) + ": " + line);
        }
        br.close();
    }

当我运行代码末尾有两个空行时,结果如下:

Line 1: Name: John
Line 2: Text: Hello
Line 3: 
Line 4: Name: Adam
Line 5: Text: Hi
Line 6: 

如果您有软件可以根据以这种方式构造的数据来验证此文件,我不知道该说什么。这似乎是验证文件的不好方法。有更有效的方法可以做到这一点,例如使用校验和。也许如果您尝试在最后使用两个空行,验证器将接受它作为正确的格式。

【讨论】:

  • 感谢解释真的很好。
  • @DALJITSINGH 我认为将问题可视化会有所帮助。
猜你喜欢
  • 1970-01-01
  • 2016-03-23
  • 2019-03-10
  • 2015-01-20
  • 2013-02-19
  • 2014-06-07
  • 1970-01-01
  • 2016-10-04
  • 1970-01-01
相关资源
最近更新 更多