缓冲读取器(BufferedReader)可以读取文本,直到某个特定字符。

5

我正在使用缓冲读取器读取一些包含信息行的文件。 一些较长的文本行超过一行,因此缓冲区以新行查看它们。 每行以';'符号结尾。 所以我想知道是否有一种方法可以使缓冲读取器读取一行直到达到';'然后将整行作为字符串返回。 这里是迄今为止我正在使用的缓冲读取器。

  String currentLine;
        while((currentLine = reader.readLine()) != null) {
            // trim newline when comparing with lineToRemove
            String[] line = currentLine.split(" ");
            String fir = line[1];
            String las = line[2];
            for(int c = 0; c < players.size(); c++){
                if(players.get(c).getFirst().equals(fir) && players.get(c).getLast().equals(las) ){
                    System.out.println(fir + " " + las);
                    String text2 = currentLine.replaceAll("[.*?]", ".150");
                    writer.write(text2 + System.getProperty("line.separator"));
                }
            }
        }

1
一些较长的文本行可能会超过一行,因此缓冲视它们为新行。那不是一行,而是多行。如果您有一个换行符(任何“\r\n”,“\n”或“\r”),则表示您有一个新行 - 如果您想将“行”定义为其他内容,请勿使用BufferedReader.readLine - Jon Skeet
好的。我希望缓冲读取器只有在遇到 ";" 时才分隔行,而不是 "\n"。更好的选择是使用扫描仪更有效吗? - Waggoner_Keith
2
使用Scanner并将分隔符设置为;。我相信有一些相关的教程“在外面”。 - Tom
2个回答

11

如果使用Scanner,你可以设置分隔符来更轻松地完成此操作:

Scanner scan = new Scanner(new File("/path/to/file.txt"));
scan.useDelimiter(Pattern.compile(";"));
while (scan.hasNext()) {
    String logicalLine = scan.next();
    // rest of your logic
}

2
logicalLine上可能会有额外的新行 - 这可能需要一些清理。 - ring bearer
两个字符作为分隔符怎么样?一个是“空格”,另一个是“换行”。 - AmiNadimi
@AmiNadimi,你的意思是这个序列是一个分隔符,还是两者都可以作为分隔符? - Mureinik
第二个短语 @Mureinik :) - AmiNadimi
2
@AmiNadimi,你可以使用正则表达式:scan.useDelimiter(Pattern.compile("[ \n]")); - Mureinik

3
直接回答您的问题,这是不可能的。 Buffered Reader无法预先扫描流以查找此字符,然后返回目标字符之前的所有内容。
当您使用Buffered Reader从流中读取时,您正在消耗字符,并且您实际上无法在不读取的情况下知道字符。
您可以使用继承的方法read()仅读取单个字符,然后在检测到所需字符时停止。当然,这样做并不好,因为它与BufferedReader的用途相矛盾。

谢谢。由于缓冲读取器无法轻松获取目标字符,因此使用扫描器会更容易许多。 - Waggoner_Keith

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