【问题标题】:wrong Reading with BufferedReader使用 BufferedReader 读取错误
【发布时间】:2013-10-06 08:30:15
【问题描述】:

我在从文件中读取数据时遇到问题。 在每一行(除了第一行)第一个字符都丢失了!

也许我编码有问题,但我尝试设置 UTF-8、UniCode、ANSI,结果一样快...

代码:

    try (FileReader fr = new FileReader("123.txt")) {
        // create a buffer for file reader
        BufferedReader br = new BufferedReader(fr);
        do {
            input = br.readLine();

            System.out.println(input);
        } while (br.read() != -1);
    } catch (IOException ex) {
        System.out.println("IOex : " + ex);
    }

控制台:

2
呸呸呸

FAF9F5

FDBCA1

FBCCB8

但必须是:

2
#FFFFFF
2
#FAF9F5
6
#FDBCA1
9
#FBCCB8
9

只有当我在行前加上斜线时才有效。

2
\#FFFFFF
\2
\#FAF9F5
\6
\#FDBCA1
\9
\#FBCCB8
\9

会是什么?
谢谢!

【问题讨论】:

  • 你为什么要检查以\n结尾的input?不能,因为您使用的是readLine!请显示文件的内容。
  • 我想,问题就在那里。没错)
  • 您在循环结束时读取一个字节并将其丢弃。你意识到read() 实际上确实读取了一个字节。

标签: java file-io bufferedreader


【解决方案1】:

问题在于do 循环的结束:

do {
    input = br.readLine();
    if (input.endsWith("\n")) {
        input = input.substring(0, input.indexOf("\n"));
    }
    System.out.println(input);
} while (br.read() != -1);

您正在调用read(),它将读取下一行的第一个字符-但您使用它来检查文件是否已结束。 (注意你是如何得到 first 行的第一个字符的,因为你在此调用 readLine 而之前没有调用 read。)

这会很好 - 而且更简单:

String line;
while ((line = br.readLine()) != null) {
    System.out.println(line);
}

readLine 在到达数据末尾时返回null。请注意,您不需要检查包含\ninput,因为您已经一次读取一行,并且\n 被视为行分隔符。

【讨论】:

  • +1 建议一个 for 循环:for(String line; (line = br.readLine()) != null; ) { 以限制范围。
  • @PeterLawrey:是的,你之前曾建议过——我个人更喜欢while 循环方法......组合的作业和测试足够“讨厌”,而不是在for使用空的 ForUpdate 部分循环。范围泄漏很烦人,但IMO还不错。我猜是个人喜好问题。
猜你喜欢
  • 1970-01-01
  • 2013-02-17
  • 2015-10-03
  • 1970-01-01
  • 1970-01-01
  • 2011-08-07
  • 1970-01-01
  • 2015-05-12
  • 2019-01-09
相关资源
最近更新 更多