我正在第一次涉足StreamIO。我有一个文本文件(用户输入的名称),我可以使用此代码正确阅读:
Scanner inputStream = null;
**Prompt user for fileName, check if exists etc.**
try {
inputStream = new Scanner(new File(fileName));
inputOpen = 1;
}
catch(FileNotFoundException e) {
System.out.println("Error opening the file " + fileName);
}
catch (IOException e) {
System.out.println("Unkown errow with the file " + fileName);
}
while(inputStream.hasNextLine()) {
String line = inputStream.nextLine();
System.out.println(line);
}
根据我的任务,我需要在文件中循环输入文本并忽略空格,然后以一定长度的行输出(由用户设置)。所以我使用while循环去EOF,从文本中获取下一个单词,将其添加到一行并测试该长度。如果它适合,我将它添加到行,如果它超过我打印当前行并开始下一行。所以我现在正在使用它:
while(inputStream.hasNextLine()) {
String line = null, lineTest = null;
String word = inputStream.next();
lineTest = (lineTest + " " + word);
if (lineTest.length() > width) {
outputStream.println(line);
line = word;
}
else
line = (line + " " + word);
}
我得到了这一行的NoSuchElementException:String word = inputStream.next();
我不能很好地理解这个例外来诊断它。从它是什么样的,我试图扫描那些不存在的东西,比如过去的EOF。我认为我的while循环是正确的,那还有什么呢?
答案 0 :(得分:0)
将hasNext
与next
一起使用。将hasNextLine
与nextLine
一起使用。
可能存在下一行,但不是下一个单词 - 例如,如果文件中的最后一行是空白的。然后nextLine
将返回空行,但next
会抛出异常,因为没有更多的单词。
答案 1 :(得分:0)
几乎immibus所说的。 添加例如:
想象一下,你使用nextInt()
从键盘输入中请求一个int用户在一行输入数字'8'。虽然nextInt()将返回用户输入的'8',但未读取输入中的新行字符“\ n”,因为它出现在int之后。
在用户输入之后有一个隐含的“\ n”,并且任何事情,但是nextLine()将拾取所有内容但是“\ n”。因此nextInt()将获取int,next()将获取一个单词,依此类推。
所以,如果在你向用户询问某个输入而不是nextLine()之后,然后你的下一个请求在程序中的任何其他位置是nextLine(),那么nextLine()方法将返回隐含的“\ n”用户输入的最后一行(因为从未返回此“\ n”)。我希望我有意义。感觉有点难以描述。
一个具体的例子:
int a = kb.nextInt(); //user enters the integer 8 and presses ENTER, creating a new line in the input stream which you must keep track of
String text = kb.nextLine(); // user enters any string
int'a'将存储整数8,'text'将存储简单的“\ n”。这是因为如果您允许用户在语句之间按下输入(例如,如果您在不同时间询问),那么用户输入就是字面意思:“8”+“\ n”+“用户输入字符串”+“\ n”< / p>
所以nextInt()之后的nextLine()会在8之后获取“\ n”而不是“用户输入字符串”之后的那个!
为避免这种情况,我通常会这样做:
int a = kb.nextInt();
kb.nextLine(); //simply grabs the "\n" after any integer is entered
String text = kb.nextLine()
这样你就可以抓住你想要获得的那条线。
我使用了用户输入示例,因为它更直观,但当然相同的概念适用于使用类Scanner的对象从文本文件解析的文本。你测试了一个hasNnextLine()的文件,它确实有一个;它可能只是:“\ n” - &gt;文件结束 所以它有一个nextLine(),但它没有next()。这就是问题所在。
很抱歉对一个相对简单的问题给出了很长的答案。