我有一个关于提示和接受文件名的快速问题,然后将文件文本作为扫描仪对象。
我希望程序提示用户输入文件名,直到他得到一个文件名,然后将文件文本用作扫描仪对象。
这是我到目前为止的代码,它工作到我退出while {}
循环的程度,但是当我尝试处理像while (input.hasNextLine()) {
这样的扫描程序项时它会给我一个错误说它无法找到扫描仪项目。
这可能是一个愚蠢的错误,但我似乎无法得到它。
整个代码如下:
import java.io.*;
import java.util.*;
public class PersonalityTest {
public static void main(String[] args) throws FileNotFoundException {
boolean isFile = false;
Scanner sc = new Scanner(System.in);
System.out.print("Input file name? ");
String fileName = sc.next();
File inputFile = new File(fileName);
while (isFile == false) {
if (inputFile.exists()) {
Scanner input = new Scanner(inputFile);
isFile = true;
}
}
while(input.hasNextLine()) {
}
}
答案 0 :(得分:2)
input
变量的范围是while (isFile == false)
块的本地范围。在外面声明它,否则它将不可见。
对于第一部分“我希望程序提示用户输入文件的名称,直到他得到一个存在的文件”:移动此代码:
Scanner sc = new Scanner(System.in);
System.out.print("Input file name? ");
String fileName = sc.next();
File inputFile = new File(fileName);
进入方法并在存在检查之前在while (isFile == false)
块内调用它(该方法应该返回文件或通过其他方式使块中的变量可见)。
答案 1 :(得分:1)
你不能在input
语句之外访问if
,编译器不确定,它会通过测试,你可以这样做:
Scanner sc = new Scanner(System.in);
Scanner input = null;
boolean isFile = false;
while (isFile == false){
System.out.print("Input file name? ");
String fileName = sc.next();
File inputFile = new File(fileName);
if (inputFile.exists()){
input = new Scanner(inputFile);
isFile = true;
}
}
但如果是NullPointerException
,则会抛出null
。
我稍微更改了代码,这样,如果文件不存在,它就不会超过。
答案 2 :(得分:0)
扫描程序input
是您if
声明的本地代码。由于这个原因,您的while (input.hasNextLine()) {
声明无效。 Java编译器将input
视为单独的Scanner对象,将问题突然出现,因为对于Java编译器,您尝试使用的input
确实存在不存在。
我会遵循MouseEvent建议的代码,因为它没有遇到上面提到的问题。
答案 3 :(得分:0)
其他答案已经解决了您的直接问题,但我想指出您的代码中的其他一些问题:
您检查文件是否可以打开的方式存在缺陷。编写代码的更好方法是尝试打开文件...并在出现异常时重试。例如:
Scanner input = null;
do {
System.out.print("Input file name? ");
String fileName = sc.next();
File inputFile = new File(fileName);
try {
input = new Scanner(inputFile);
} catch (IOException ex) {
System.out.println("Cannot open: " + ex.getMessage());
}
} while (input == null);
为什么这比调用File.exists()
更好?
您可以打开文件的原因有很多。它可能根本不存在。它可能是无法作为文件打开的目录或特殊文件。该应用程序可能没有权限。该文件可能位于远程安装的文件系统上,远程安装可能刚刚死亡。
File.exists()
调用(以及您可能制作的任何其他调用)与实际打开文件之间存在小的时间间隔。在那段时间内,你的程序可能会做一些事情来使文件无法打开;例如它可以更改其权限或删除它。
第二个问题是您的代码可能会泄漏文件描述符,因为扫描程序未关闭。在您的特定应用程序(如书面)中,这无关紧要,因为您将在使用扫描仪后立即退出应用程序。但如果你不是......并且这段代码被多次调用了......你可能会发现你稍后无法打开文件。
处理这个问题的正确方法是编写如下代码:
public static void main(String[] args) {
try (Scanner input = openInput()) {
while (input.hasNextLine()) {
// do stuff
}
}
}
这使用Java 7的新“try with resource”语法,确保在try语句完成时关闭资源。 (您可以使用try / finally在Java 7之前做同样的事情,但代码有点麻烦。)