1

我有一个关于提示和接受文件名的快速问题,然后将文件文本作为扫描仪对象。

我希望程序提示用户输入文件名,直到他得到一个存在的文件,然后将文件文本用作扫描仪对象。

这是我到目前为止的代码,它工作到我退出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()) {

    }
}
4

4 回答 4

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)在存在检查之前在块内调用它(该方法应该与文件一起返回或通过其他方式使变量在块中可见)。

于 2012-12-02T07:12:44.047 回答
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;
    }            
}

但是会抛出一个NullPointerExceptionif it is null

我稍微更改了代码,这样,如果文件不存在,它就不会超过。

于 2012-12-02T07:11:32.530 回答
0

扫描仪在您的声明中input是本地的。if因此,您的while (input.hasNextLine()) {陈述将不起作用。Java 编译器将input视为一个单独的 Scanner 对象,这就是问题出现的地方,因为对于 Java 编译器,input您尝试使用的对象不存在。

我会遵循 MouseEvent 的建议代码,因为它不会遇到上述问题。

于 2012-12-02T07:20:38.007 回答
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 语句完成时关闭资源。(您可以在 Java 7 之前的版本中使用 try / finally 来做同样的事情,但代码有点麻烦。)

于 2012-12-02T07:48:41.117 回答