3

编辑:

工作代码:

    Scanner input = new Scanner(System.in);
    String inputFile = "Computer_Store_DSV.txt";
    String userInputFile;

    File sourceFile;
    do {
        System.out.println("Please enter the path of the file, enter to use the default path");
        userInputFile = input.nextLine();
        if (!"".equals(userInputFile)) {
           inputFile = userInputFile;   
        }
        sourceFile = new File(inputFile);

        System.out.println("Path is = " + inputFile);

        if (!sourceFile.canRead()) {
            System.out.println("Unable to read the file");
        }
    } while (!sourceFile.canRead());
    Scanner record = new Scanner(sourceFile);

感谢呼吸的帮助。

我有以下代码:

Scanner input = new Scanner(System.in);
boolean fileLoop = false;
String inputFile = "Computer_Store_DSV.txt";
String userInputFile;

    do {
        System.out.println("Please enter the path of the file, enter to use the default path");
        userInputFile = input.nextLine();
        if (!"".equals(userInputFile)) {
            inputFile = userInputFile;
        }
        File sourceFile = new File(inputFile);
        System.out.println("Path is = " + inputFile);

        if (!sourceFile.canRead()) {
            System.out.println("Unable to read the file");
            fileLoop = true;
        }
    while (fileLoop);
    Scanner record = new Scanner(sourceFile);

如您所见,我正在尝试在启动邮件程序之前“验证”文件是否存在。

有没有办法在不使用 File 类两次“验证和实际程序”的情况下做到这一点?

4

3 回答 3

2

请看一下这个解决方案。我相信它可以实现您想要实现的目标。我已经重组了代码并使用了 2 种额外的方法。最后我关闭了输入,因为你可以创建一个内存泄漏,以防它保持打开状态。

我已经测试了任何文件位置的代码,它可以毫无问题地检索它。您可以从项目内或计算机的任何位置检索文件。您唯一需要提供的是路径(不包括文件名),因为只要您始终使用同一个文件,您就可以利用 String 的 concat() 方法。

假设该文件位于目录 /foo/fooBar/Examples/Computer_Store_DSV.txt 中。如果您想访问该文件,您应该编写 foo/fooBar/Examples/ (注意最后一个斜杠: *你必须提供它*)。另一个例子:如果文件位于项目的根文件夹中,按回车键会找到正确的方法。如果它在您的项目中名为 resources 的文件夹中,那么您只需编写 resources/ ,它就会找到该文件。

如果找到该文件,它会通知您该文件已找到,它使 fileLoop 为 false 并创建一个 Scanner 命名记录。

您将看到这些方法被声明为静态的。它们是这样的,因为我在 main 内部使用它们并且它们必须是静态的。如果您的代码不在主类中,则可以从方法中删除静态。

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class TestScanner {
    public static void main(String args[]) throws FileNotFoundException {
        Scanner input = new Scanner(System.in);
        boolean fileLoop = true;
        String inputFile = "Computer_Store_DSV.txt";
        String userInputFile;
        File sourceFile = null;
        Scanner record = null;
        do {
            System.out.println("Please enter the path of the file, or press enter to use the default path");
            userInputFile = input.nextLine();

            if (!userInputFile.isEmpty() && new File(userInputFile.concat(inputFile)).exists() ) {
                inputFile=userInputFile.concat(inputFile);
                printState(inputFile,"File found.!");
                sourceFile = new File(inputFile).getAbsoluteFile();
                fileLoop=readFile(sourceFile);
                record = new Scanner(sourceFile);
            }
            else if (new File(inputFile).getAbsoluteFile().exists()){
                sourceFile = new File(inputFile).getAbsoluteFile();
                printState(inputFile,"File found.!");
                fileLoop=readFile(sourceFile);
                record = new Scanner(sourceFile);
            }
            else{
                fileLoop=true;
                printState(inputFile,"File does not exist.!");
            }
        } while (fileLoop);
        input.close();

    }

    public static boolean readFile(File sourceFile){
        if (!sourceFile.canRead()) {
            System.out.println("Unable to read the file");
            return true;
        }
        else
            return false;
    }

    public static void printState(String inputFile,String state){
        System.out.println(state);
        System.out.println("Path used:  " + new File(inputFile).getAbsolutePath()+"\n");
    }
}

您还可以通过传递以下内容来避免创建 sourceFile

new File(inputFile).getAbsoluteFile()

像这样直接到扫描仪

record = new Scanner(new File(inputFile).getAbsoluteFile()).
于 2012-11-21T17:18:16.737 回答
1

如果要验证文件是否存在,可以使用Files.exist(Path,LinkOption...)方法。这样您根本不需要创建文件

final boolean fileExists = Files.exists (Paths.get ("fileName"));
于 2012-11-21T15:18:24.683 回答
0

虽然您的用例看起来相对简单,但我建议您探索 Apache Commons Lang(http://commons.apache.org/lang/api-3.1/index.html) 和 Commons IO (http://commons.apache.org /io/api-release/index.html) 库。这些实用程序类将来会变得更加方便。

一些笔记基于if (!"".equals(userInputFile))

什么是字符串 userInputFile 是“”还是 null?为此,我通常使用 Commons Lang(3) 中的 Validate。Validate.notBlank(userInputFile) 来帮助解决这种情况。

至于验证文件是否存在并且可以读取,您可以使用 File.exists() 如上所述。您也可以将其移至 if 语句中:

if(sourceFile.exists() && sourceFile.canRead() {
    // do some work with the file
}
于 2012-11-21T15:32:54.810 回答