Почему мне нужно вводить полный путь при чтении файла? [дубликат]

Dec 17 2020

Я новичок в Java и имею опыт работы на C ++. Я сделал очень простой код, чтобы проверить чтение файлов. У меня есть входной файл с именем «input.txt» и он находится в том же файле, что и мой основной файл, с именем «Main.java». Однако, когда я пытаюсь создать новый экземпляр объекта File с именем «input. Txt», он не находит файл, и 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());