Por que preciso inserir o caminho completo ao ler um arquivo? [duplicado]

Dec 17 2020

Eu sou novo em Java e venho de uma experiência em C ++. Eu fiz um código muito simples apenas para testar a leitura de arquivos. Eu tenho um arquivo de entrada chamado "input.txt" e está no mesmo arquivo que meu arquivo principal chamado "Main.java". No entanto, quando tento criar uma nova instância de um objeto File usando o nome "input. Txt", ele não encontra o arquivo e file.exists () retorna false. Quando, em vez disso, coloco o nome do caminho completo, ele encontra o arquivo. O código é exibido abaixo:

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

    }
}

Estou fazendo algo errado aqui porque não vejo por que não deveria ser capaz de inserir apenas o nome do arquivo em vez do caminho completo. Em C ++, se os arquivos estivessem na mesma pasta, eu poderia simplesmente inserir o nome do arquivo, então estou confuso de por que isso não está funcionando aqui. Abaixo está a saída que recebo:

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)

Alguém pode me ajudar a entender o que está acontecendo? Qualquer ajuda seria muito apreciada.

Respostas

DuncG Dec 17 2020 at 23:14

Você pode ver para onde o caminho é resolvido (que será o dir mantido na propriedade do sistema "user.dir") da seguinte maneira:

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