¿Por qué tengo que ingresar la ruta completa al leer un archivo? [duplicar]

Dec 17 2020

Soy nuevo en Java y tengo experiencia en C ++. Hice un código realmente simple solo para probar la lectura de archivos. Tengo un archivo de entrada llamado "input.txt" y está en el mismo archivo que mi archivo principal llamado "Main.java". Sin embargo, cuando intento crear una nueva instancia de un objeto File usando el nombre "input. Txt", no encuentra el archivo y file.exists () devuelve falso. Cuando, en cambio, pongo el nombre completo de la ruta, encuentra el archivo. El código se muestra a continuación:

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

    }
}

¿Estoy haciendo algo mal aquí porque no veo por qué no debería poder ingresar el nombre del archivo en lugar de la ruta completa? En C ++, si los archivos estuvieran en la misma carpeta, simplemente podría ingresar el nombre del archivo, así que estoy confundido sobre por qué eso no funciona aquí. A continuación se muestra el resultado que obtengo:

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)

¿Alguien puede ayudarme a entender lo que está pasando? Cualquier ayuda será muy apreciada.

Respuestas

DuncG Dec 17 2020 at 23:14

Puede ver dónde se resuelve la ruta (que será el directorio que se encuentra en la propiedad del sistema "user.dir") de la siguiente manera:

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