在读取EOF后使用Scanner类读取Standard.In获取NoSuchElementException

时间:2011-12-13 02:04:03

标签: java java.util.scanner eof

所以,首先,这是家庭作业,虽然不是我的。这是我的姐夫。自从我做电脑以后,他向我求助,但我只使用C ++。他正在使用System.in将键盘输入读入文件,直到他获得EOF。之后,他创建了Scanner的实例,并在实例上调用nextLine以尝试获取filename并获得NoSuchElementException。根据Javadoc的说法,这意味着没有收到任何输入,使用System.in并在键盘上输入时回来似乎很奇怪。我怀疑EOF字符在某种程度上没有被消耗掉。他的代码将在今晚午夜到期,他已完成其他所有工作(我建议他使用虚拟文件名并回到问题所在。)

这是他的代码:

import java.util.*;
import java.io.*;

public class FileTest
{
    public static void main(String[] args)
{
        createFile();
        readFile();
    }

public static void createFile()
{

    //Variables
    InputStream istream;
    PrintStream ostream;
    istream = System.in;
    ostream = System.out;
    Scanner keyboard = new Scanner(System.in);
    int lastEntry = 0;
    final int EOF = -1;


    //Asks user for filename.
    try
    {
        String fileName;
        System.out.println("Please enter the filename of the file you want to open: ");
        fileName = keyboard.next();

        //Creates specified file.           
        File currentFile = new File(fileName);

        //Checks if file already exists.
        while(currentFile.exists())
        { 
            System.out.println(fileName + " already exists");
            System.out.println("Error: To prevent tis file from being overwritten please enter another file name");
            fileName = keyboard.nextLine();         
        }

        //Asks user for information they want stored in file.           
        try 
        {
            ostream = new PrintStream(fileName);
            System.out.println("Please enter what you would like to put in the file and press Ctrl+Z when finished: ");

            //Writes information to file.
            try
            {
                while((lastEntry = istream.read()) != EOF)
                ostream.write(lastEntry);

            }
            catch(Exception e)
            {
                System.out.println("Error: " +e.getMessage());
            }

        }           
        catch(Exception f)
        {
            System.out.println("Error: " +e.getMessage());
        }
    }   

    finally
    {
    }

}   

public static void readFile()   
{
        InputStream input;
        PrintStream output;
        output = System.out;
        int lastEntry = 0;
        final int EOF = -1;
        Scanner keyboard2 = new Scanner(System.in);

        //Asks user for filename.
        String newFile;
        System.out.println("Please enter the filename of the file you want to open: ");

            newFile = keyboard2.next();
    }       
}

他在NoSuchElementException行上收到newFile = keyboard2.next()错误。我已经浏览了大量的例子,发现人们发布了有关此问题的帖子,但我还没有找到解决方案,所以我想我会把我的(可疑的)声誉放在他的线上。任何人都知道如何让它发挥作用?

3 个答案:

答案 0 :(得分:2)

控制台上的EOF字符表示文件末尾。这就是Scanner方法调用抛出NoSuchElementException的原因。

纯Java应用程序无法在EOF标记之后读取任何内容。


  

没有办法清除它?

不是纯Java。从理论上讲,你可以用原生代码做到这一点,但我怀疑老师会接受这个。

答案 1 :(得分:2)

这里有一个无限循环:

    //Checks if file already exists.
    while(currentFile.exists())
    { 
        System.out.println(fileName + " already exists");
        System.out.println("Error: To prevent tis file from being overwritten please enter another file name");
        fileName = keyboard.nextLine();         
    }

currentFile未使用新文件名进行更新。

至于手头的实际问题,Stephen是对的,一旦你点击EOF方法中的createFile,就无法从键盘获得更多输入。在这方面,您确定EOF没有被消费。您需要使用其他类型的信号来指示输入文本的结尾(可能是文字字符串"EOF"。)

答案 2 :(得分:1)

我正在阅读您的代码,我认为我发现了一个与您的问题完全无关的错误:

        //Checks if file already exists.
        while(currentFile.exists())
        { 
            System.out.println(fileName + " already exists");
            System.out.println("Error: To prevent this file from being overwritten please enter another file name");
            fileName = keyboard.nextLine();         
        }

如果currentFile.exists(),您将获得无限循环,因为您不会在循环中更新currentFile,只需fileName

虽然目前这可能不是您最关心的问题,但您仍应修复它以避免将来遇到此问题。


解决您的问题: 他可以捕获NoSuchElementException。在他的捕获声明中,他可以执行一个声明,做任何他想做的事情:退出方法,结束程序,任何事情!