文件I / O Java提示

时间:2012-12-02 07:07:24

标签: java file-io while-loop

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

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

这是我到目前为止的代码,它工作到我退出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 个答案:

答案 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之前做同样的事情,但代码有点麻烦。)