所以,首先,这是家庭作业,虽然不是我的。这是我的姐夫。自从我做电脑以后,他向我求助,但我只使用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()
错误。我已经浏览了大量的例子,发现人们发布了有关此问题的帖子,但我还没有找到解决方案,所以我想我会把我的(可疑的)声誉放在他的线上。任何人都知道如何让它发挥作用?
答案 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。在他的捕获声明中,他可以执行一个声明,做任何他想做的事情:退出方法,结束程序,任何事情!