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クラスを2回使用せずにそれを行う方法はありますか?

4

3 に答える 3

2

このソリューションをご覧ください。私はそれがあなたが達成したいことをすることを信じています。コードを再構築し、2つの追加メソッドを使用しました。最後に、入力が開いたままの場合にメモリリークが発生する可能性があるため、入力を閉じています。

私は任意のファイルの場所でコードをテストしましたが、問題なく取得されます。プロジェクト内またはコンピューターの任意の場所からファイルを取得できます。常に同じファイルを使用している限り、Stringのconcat()メソッドを利用できるため、指定する必要があるのはパス(ファイル名なし)だけです。

ファイルがディレクトリ/foo/fooBar/Examples/Computer_Store_DSV.txtにあると仮定します。ファイルにアクセスしたい場合は、foo / fooBar / Examples /と書く必要があります(最後のスラッシュに注意してください: *提供する必要があります*)。別の例:Enterキーを押してファイルがプロジェクトのルートフォルダー内にある場合は、正しい方法が見つかります。プロジェクト内のresourcesという名前のフォルダーにある場合は、resources /を書き込むだけで、ファイルが見つかります。

ファイルが見つかった場合は、ファイルが見つかったことを通知し、fileLoopをfalseにして、recordという名前のスキャナーを作成します。

メソッドが静的として宣言されていることがわかります。私はメインの中でそれらを使用していて、それらは静的でなければならないので、それらはこのようなものです。コードがメインクラス内にない場合は、メソッドからスタティックを削除できます。

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 に答える