如何判断一个空行是否已经被 BufferedReader 读入?

7

I'm reading in a text file formated like

word
definiton

word
definition
definition

word
definition

因此,我需要根据当我到达那些空行时是否在定义中进行跟踪。问题是,BufferedReader 会丢弃 \n 字符,而将那个空行与 String "" 进行比较并没有像我想的那样被注册。我该如何处理这个问题。


请不要在标题中添加标签。 - SLaks
5个回答

20
  1. 确保使用 "".equals(myString) (这是null-安全的),而不是 myString == ""
    • 在1.6之后,可以使用 myString.isEmpty()(不是null-安全的)
  2. 您可以使用 myString.trim() 来在上述检查之前消除额外的空格

以下是一些代码:

public void readFile(BufferedReader br) {
  boolean inDefinition = false;
  while(br.ready()) {
    String next = br.readLine().trim();
    if(next.isEmpty()) {
      inDefinition = false;
      continue;
    }
    if(!inDefinition) {
      handleWord(next);
      inDefinition = true;
    } else {
      handleDefinition(next);
    }
  }
}

2
如果版本号为1.6或更高,使用String#isEmpty - mre
你要修剪字符串中间的空格吗?因为这些是像“红色蓝色绿色”这样的定义,我不想让它们变成“红色蓝色绿色”。 - Aerlusch
trim() 只会移除开头和结尾处 <= ' ' 的字符。它不会移除所有的空格,但会移除控制字符。 - Peter Lawrey
谢谢,这真的解决了我对此的困惑。我不得不在字符串最终为空的块中添加一些额外的代码来处理多行定义的完成字符串。 - Aerlusch

6
BufferedReader.readLine()方法返回一个空字符串,如果读取到的行为空。 根据javadoc文档所述:

返回结果:包含该行的内容(不包括任何行终止字符)的字符串,如果已经到达流的末尾,则返回null。

如果你没有看到空字符串,则要么这一行不是空行,要么你没有正确测试是否为空字符串。请注意保留原有的HTML标签。

2
line = reader.readLine();
if ("".equals(line)) {
   //this is and empty line...
}

我不知道你是如何尝试检查字符串是否为空的,所以我无法解释为什么它对你不起作用。你可能使用 == 进行比较吗?在这种情况下,它不起作用是因为 == 比较引用而不是对象内容。


1
这段代码片段跳过空行,只打印有内容的行。
    String line = null;
    while ((line = br.readLine()) != null) {
        if (line.trim().equals("")) {
            // empty line
        } else {
            System.out.println(line);
        }
    }

只包含空格字符的行也将被跳过。


-2
try (BufferedReader originReader = getReader("now")) {
    if (StringUtils.isEmpty(originReader.readLine())) {
        System.out.printline("Buffer is empty");
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接