【问题标题】:How to detect EOF in Java?如何在 Java 中检测 EOF?
【发布时间】:2016-04-09 11:06:10
【问题描述】:

我尝试了一些方法来检测代码中的 EOF,但仍然无法正常工作。 我尝试使用 BufferedReader、Scanner 和使用 char u001a 来标记 EOF,但对我的代码仍然没有任何意义。 这是我最后的代码:

    Scanner n=new Scanner(System.in);
    String input;
    int counter=0;

    while(n.hasNextLine())
    {
        input=n.nextLine();
        char[] charInput=input.toCharArray();
        for (int i = 0; i < input.length(); i++) {
            if(charInput[i]=='"')
            {
                if(counter%2==0)
                {
                    System.out.print("``");
                }
                else
                {
                    System.out.print("''");
                }
                counter++;
            }
            else
            {
                System.out.print(charInput[i]);
            } 
        }
        System.out.print("\n");
    }

程序在到达 EOF 时应该停止,但我不知道为什么,由于某些原因它继续运行并导致运行时错误。 请帮忙。 顺便说一下,我是新来的,如果我的问题不是很清楚,很抱歉, 之前谢谢你:)

【问题讨论】:

  • 您遇到的运行时错误是什么?..
  • 另外,查看this 帖子,了解如何使用FileReader + BufferedReader 读取文件
  • 我相信扫描仪只会返回 null 而不是 EOF 字符。这将解释运行时异常。
  • @JornVernee 否 hasNextLine 将检查底层读取是否为 null 并返回 false。他的程序在我的机器上按预期运行。
  • 您正在从控制台 (stdin) 读取输入,可能它在您的主机上表现得很奇怪。尝试从您打开的文件中读取。

标签: java eof


【解决方案1】:

它一直在运行,因为它没有遇到 EOF。在流结束时:

  1. read() 返回 -1。
  2. read(byte[]) 返回 -1。
  3. read(byte[], int, int) 返回 -1。
  4. readLine() 返回 null。
  5. readXXX() 用于任何其他 X 抛出 EOFException
  6. Scanner.hasNextXXX() 对任何 X 都返回 false。
  7. Scanner.nextXXX() 为任何 X 抛出 NoSuchElementException

除非您遇到其中一种情况,否则您的程序不会遇到流结束。注意\u001a 是 Ctrl/z。不是EOF。 EOF 不是字符值。

【讨论】:

  • 可能值得指出的是,您需要使用相应的hasNext... 调用,而不仅仅是hasNextLine,因为如果您使用next 读取最后一个标记并且有最后一个空行。
【解决方案2】:

这就是我所做的

Scanner s = new Scanner(f); //f is the file object

while(s.hasNext())
{
String ss = s.nextLine();
System.out.println(ss);
}

为我工作

【讨论】:

  • 您应该将hasNextLine()nextLine() 结合使用,其他方法对也应如此。
【解决方案3】:

特别是System.in,您应该能够通过FileDescriptor.in.valid()检查支持FileDescriptor是否仍然打开。

简单演示:

$ cat FD.java
public class FD {
  public static void main(String[] args) throws Exception {
    System.out.println(java.io.FileDescriptor.in.valid());
    System.in.close();
    System.out.println(java.io.FileDescriptor.in.valid());
  }
}

$ javac FD.java
$ java -cp . FD
true
false

【讨论】:

    【解决方案4】:

    您可以使用try and catch

    Scanner n=new Scanner(System.in);
    String input;
    int counter=0;
    input=n.nextLine();
    try{
        while(input!=null)
        { 
            char[] charInput=input.toCharArray();
            for (int i = 0; i < input.length(); i++) {
                if(charInput[i]=='"')
                {
                    if(counter%2==0)
                    {
                        System.out.print("``");
                    }
                    else
                    {
                        System.out.print("''");
                    }
                    counter++;
                }
                else
                {
                    System.out.print(charInput[i]);
                } 
            }
            System.out.print("\n");
            input=n.nextLine();
        }
    }catch(Exception e){
    
    }
    

    这里,当你给 Ctrl+z 时,Scanner.nextLine() 会给你NoSuchElementException将此异常用作 EOF 的条件。要处理此异常,请使用 try 和 catch。

    【讨论】:

    • Hacky - 它忽略了旨在告诉您输入何时用尽的 hasNextLine 方法。
    • 不正确。 nextLine() 不会在 EOS 上返回 null,它会抛出 NoSuchElementException
    猜你喜欢
    • 1970-01-01
    • 2010-11-28
    • 2018-01-01
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多