Filenotfoundexception obwohl Datei existiert

Jorgito

Neues Mitglied
Hallo, ich habe folgendes Problem, unzwar wollte ich eine Datei auslesen doch es kam eine FileNotFoundException obwohl die Dartei existiert hat und ich den Pfad richtig eingeben habe.
Hier ist der Code den ich geschrieben habe:


Java:
package com.advanced.filehandling;

import java.io.FileReader;
import java.io.IOException;

public class FileReaderApp {

    public static void main(String[] args) {
        String   READ_TEST_FILE_PATH = "\\src\\com\\advanced\\filehandling\\ReadTest.txt";

        char[] firstHundredCharacters = new char[100];

        try (FileReader readTestReader = new FileReader(READ_TEST_FILE_PATH)) {
            readTestReader.read(firstHundredCharacters);
            System.out.println(firstHundredCharacters);
            System.out.println("Read more");
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

Und es kam folgende Fehlermeldung:

Code:
java.io.FileNotFoundException: \src\com\advanced\filehandling\ReadTest.txt (No such file or directory)
    at java.base/java.io.FileInputStream.open0(Native Method)
    at java.base/java.io.FileInputStream.open(FileInputStream.java:216)
    at java.base/java.io.FileInputStream.<init>(FileInputStream.java:157)
    at java.base/java.io.FileInputStream.<init>(FileInputStream.java:111)
    at java.base/java.io.FileReader.<init>(FileReader.java:60)
    at com.advanced.filehandling.FileReaderApp.main(FileReaderApp.java:13)
 
Wichtiger Hinweis, da hier schon mal jemand unterwegs war, der seinen Source mit allem anderen gemischt hat ("wozu brauch ich eine IDE?").
Weder dein Projekt-Verzeichnis noch dein Source-Verzeichnis sind dein Ausführungsverzeichnis.

In das Source-Verzeichnis gehören keine Dateien, die während der Laufzeit als Dateien gelesen oder schlimmer noch geschrieben werden sollen.

Ich halte sogar gerne Grafiken usw. getrennt (liegen nicht im Source-Ordner), aber wenn es sich bei der Datei um eine fix vorgegebene Resource handelt, die mit in die jar reinkopiert wird, dann musst du sie auch als Resource einlesen, so wie @mihe7 gesagt hat.
Vorweg: Anstatt Backslash verwendet man dafür immer Slash und ganz vorne würde schonmal keiner stehen. ("src/com/advanced/filehandling/ReadTest.txt")
Handelt es sich hingegen um eine Datei, die nicht in die Jar kommt, sondern so mit ausgeliefert wird, dann ist der Pfad Unsinn. Welches Programm kennst du, das seine Dateien in einem Unterverzeichnis namens "src" hat? Dann musst du dir erst mal klar werden, wie deine Projekt-Ordnerstruktur funktioniert und wo dein Ausführungsverzeichnis ist.
 
Darf ich in den Klugscheißer-Modus gehen?

Weder dein Projekt-Verzeichnis noch dein Source-Verzeichnis sind dein Ausführungsverzeichnis.
Beim Ausführen in der Entwicklungsumgebung kann dies aber natürlich der Fall sein. Aber das ist halt nur zur Entwicklungszeit so. Die Kernaussage ist natürlich bezogen auf die Weitergabe später. Wenn Du ein Programm schreibst, dann soll dies ja später auch ohne die Sourcen funktionieren.

In das Source-Verzeichnis gehören keine Dateien, die während der Laufzeit als Dateien gelesen oder schlimmer noch geschrieben werden sollen.
Das kann man nicht gut genug unterstreichen. Aber gerade mit dem "getrennt halten" kann es bei manchen Entwicklungsumgebungen problematisch sein. Eclipse z.B. (Yeah - erstes Eclipse Bashing in diesem Jahr! Wie sehr mir das gefehlt hat) legt in seinen Projekten wirklich alles in src. Alles, was .java ist, ist dann halt Java Source und alles Andere ist dann eine Ressource. Finde ich auch ganz schrecklich aber das muss man halt auch etwas wissen.

("src/com/advanced/filehandling/ReadTest.txt")
Wenn das, was in src steht und dann im Jar oder bei den Klassen landet, dann wird der Pfad später (über den classloader zu lesen) natürlich ohne das src sein. Also ein "/com/advanced/filehandling/ReadTest.txt". Hier ist der / auch nicht unwichtig, den ja nach verwendeter Methode ist es sonst relativ zu dem Namespace der Klasse, aus der zugegriffen wird.

Das einfach nur als Ergänzung.
 
Wenn das, was in src steht und dann im Jar oder bei den Klassen landet, dann wird der Pfad später (über den classloader zu lesen) natürlich ohne das src sein. Also ein "/com/advanced/filehandling/ReadTest.txt". Hier ist der / auch nicht unwichtig, den ja nach verwendeter Methode ist es sonst relativ zu dem Namespace der Klasse, aus der zugegriffen wird.
Richtig, da hab ich mich vertan.
 

Zurück
Oben