Dlaczego podczas czytania pliku muszę podać pełną ścieżkę? [duplikować]

Dec 17 2020

Jestem nowy w Javie i wywodzę się z C ++. Zrobiłem naprawdę prosty kod, aby przetestować odczyt plików. Mam plik wejściowy o nazwie „input.txt” i znajduje się w tym samym pliku, co mój plik główny o nazwie „Main.java”. Jednak gdy próbuję utworzyć nową instancję obiektu File przy użyciu nazwy „input. Txt”, plik nie znajduje, a plik.exists () zwraca wartość false. Kiedy zamiast tego umieszczam pełną nazwę ścieżki, plik znajduje. Kod jest wyświetlany poniżej:

 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();

    }
}

Czy robię coś źle, ponieważ nie rozumiem, dlaczego nie powinienem być w stanie po prostu wpisać nazwy pliku zamiast pełnej ścieżki. W C ++, gdyby pliki znajdowały się w tym samym folderze, mógłbym po prostu wpisać nazwę pliku, więc jestem zdezorientowany, dlaczego to tutaj nie działa. Poniżej znajduje się wynik, który otrzymuję:

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)

Czy ktoś może mi pomóc zrozumieć, co się dzieje? Każda pomoc byłaby bardzo mile widziana.

Odpowiedzi

DuncG Dec 17 2020 at 23:14

Możesz zobaczyć, gdzie prowadzi ścieżka (będzie to katalog przechowywany we właściwości systemowej „user.dir”) w następujący sposób:

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