而JAVA中的EOF?

问题描述 投票:3回答:7

在一些论坛的答案后,我正在使用这个:

    while (fileReader.nextLine() != null) {
        String line = fileReader.nextLine();
        System.out.println(line);
    }  

...但它最后会抛出异常(线程中的异常“main”java.util.NoSuchElementException:找不到行)

java
7个回答
18
投票

你应该使用while (fileReader.hasNextLine())


22
投票

每次对nextLine()的调用移动到下一行,所以当你实际上在最后一条可读行并且while检查通过检查时,下一次调用nextLine()将返回EOF


也许您可以执行以下操作之一:

如果fileReaderScanner类型:

while ((line = fileReader.hasNextLine()) != null) {
    String line = fileReader.nextLine(); 
    System.out.println(line);
}

如果fileReaderBufferedReader类型:

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

因此,您在while条件下读取当前行并将该行保存在字符串中供以后使用。


3
投票

要读取文件,建议使用Scanner类。

    Scanner scanner = new Scanner(new FileInputStream(fFileName), fEncoding);
    try {
      while (scanner.hasNextLine()){
         System.out.println(scanner.nextLine());
      }
    }
    finally{
      scanner.close();
    }

2
投票

其他人通过多次调用readLine()告诉了你足够的问题。

我只是想留下代码风格:虽然你看到这个line = assignement和!= null在大多数例子中一起检查条件(如@gotomanners示例),我更喜欢使用for

在我看来,它更具可读性......

for (String line = in.readLine(); line != null; line = in.readLine()) {
    ...
}

你可以在@TheCapn的例子中看到另一种写它的好方法。但是当你以这种方式编写它时,你很容易看出这就是for循环的用途。

我不喜欢在一行中满足条件的作业。在我看来这是不好的风格。但是因为这种特殊情况非常受欢迎,所以这样做我不会认为它真的很糟糕。 (但无法理解是谁建立了这种不好的风格变得那么受欢迎。)


0
投票

问题是你在while循环中读取nextLine()然后将其读取到变量。你不仅打印出每一条第二行,而且还要打开自己的异常。一个例子:

文件:

Hello,
Blah blah blah,
Sincerely,
CapnStank
PS. Something something

在第一次迭代循环。检查while将使用“Hello”,因为它不等于null。在循环体内,你会看到Blah blah blah,印在系统上。

这个过程将重复,真诚地,消费和Capnstank打印出来。

最后,while将消耗“PS”行,而String line = fileReader.nextLine()从文件中恢复异常,因为没有什么可以进一步阅读。

要解决此问题:

String line = fileReader.nextLine();

while (line != null) {
  System.out.println(line);
  line = fileReader.nextLine();
}

-1
投票

nextLine()将在没有行时抛出异常并且它永远不会返回null,您可以尝试使用Scanner类:http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Scanner.html


-1
投票
while(inFile.hasNext())

这在java编程语言中是正确的

© www.soinside.com 2019 - 2024. All rights reserved.