ファイルを読み取るときにフルパスを入力する必要があるのはなぜですか?[複製]

Dec 17 2020

私はJavaを初めて使用し、C ++のバックグラウンドを持っています。ファイルの読み取りをテストするためだけに、非常に単純なコードを作成しました。「input.txt」という入力ファイルがあり、そのファイルは「Main.java」というメインファイルと同じファイルにあります。ただし、「input。txt」という名前を使用してFileオブジェクトの新しいインスタンスを作成しようとすると、ファイルが見つからず、file.exists()はfalseを返します。代わりにフルパス名を入力すると、ファイルが見つかります。コードを以下に示します。

 public static void main(String[] args) throws FileNotFoundException
    {
    //  File file = new File("C:/Users/josep/OneDrive/Documents/java/input.txt"); //This works
        File file = new File("input.txt"); //why won't this work?

        if( file.exists() )
        {
            System.out.println("File exists");
        }
        else
        {
            System.out.println("Doesn't exist"); //this prints out.
        }

        Scanner input = new Scanner(file);

        String str = input.nextLine();
        System.out.println("Str: " + str);

        input.close();

    }
}

フルパスの代わりにファイル名だけを入力できない理由がわからないため、ここで何か間違ったことをしていますか?C ++では、ファイルが同じフォルダーにある場合、ファイル名を入力するだけでよいので、なぜそれがここで機能しないのか混乱しています。以下は私が得る出力です:

Doesn't exist
Exception in thread "main" java.io.FileNotFoundException: input.txt (The system cannot find the file specified)
        at java.base/java.io.FileInputStream.open0(Native Method)
        at java.base/java.io.FileInputStream.open(FileInputStream.java:211)
        at java.base/java.io.FileInputStream.<init>(FileInputStream.java:153)
        at java.base/java.util.Scanner.<init>(Scanner.java:639)
        at Main.main(Main.java:22)

誰かが私が何が起こっているのか理解するのを手伝ってもらえますか?どんな助けでも大歓迎です。

回答

DuncG Dec 17 2020 at 23:14

次のように、パスが解決される場所(システムプロパティ "user.dir"に保持されているディレクトリ)を確認できます。

System.out.println(Path.of("index.txt").toRealPath());