Eine Textdatei auslesen

Guten Abend!

Also, eine Textdatei soll einfach ausgelesen und auf der Konsole ausgegeben werden:

Java:
try (Scanner scanner = new Scanner(Paths.get("JPoint.txt"))) {
            while (scanner.hasNextLine()) {
                String row = scanner.nextLine();
                System.out.println(row);
            }
        } catch (Exception e) {
            System.out.println("Error: " + e.getMessage());
        }

... aber, die Datei wird nicht gefunden.

Java:
Error: JPoint.txt

Warum?
 
Also aus deinem Post werde ich nicht wirklich schlau: In dem Code versuchst Du JPoint.txt zu lesen aber angeblich kommt "Error: Zeitlinie.txt"?
Das ist ja keine Exception Meldung und so!
Also das passt so erst einmal nicht zusammen.

Allgemeiner Hinweis: Gib nicht nur getMessage() aus sondern rufe auch printStackTrace() auf - dann siehst Du, wo genau die Exception geworfen wurde (Falls Du irgend was anderes aufrufst und der Fehler gar nicht an der Stelle ist oder so ...)

Bezüglich Datei nicht gefunden: Er sucht im aktuellen Verzeichnis. Vermutlich passt da etwas nicht und die Datei liegt einfach nicht an der richtigen Stelle, weil die IDE bei der Ausführung irgend ein anderes Verzeichnis als Arbeitsverzeichnis nutzt.

Was man immer machen kann: Ausgeben, was genau denn versucht wird zu öffnen:
Java:
System.out.println("Öffne: " + new File("JPoint.txt").getAbsolutePath());
Das gibt dann etwas aus wie:
Öffne: /home/konrad/Projects/JavaTests/JPoint.txt

Dann kannst Du selbst nachsehen, ob da wirklich eine entsprechende Datei liegt oder nicht. Das am Besten auf der Kommandozeile. (Unter Windows der Explorer kann bekannte Dateiendungen ausblenden. Das führt dann ggf. zu Dateien wie JPoints.txt.txt oder so 🙂 )
 
Weil sie nicht im Pfad liegt
Die Paths.get Methode soll doch den Pfad ermitteln, oder verstehe ich das falsch?
Also aus deinem Post werde ich nicht wirklich schlau: In dem Code versuchst Du JPoint.txt zu lesen aber angeblich kommt "Error: Zeitlinie.txt"?
Das ist ja keine Exception Meldung und so!
Also das passt so erst einmal nicht zusammen.

Allgemeiner Hinweis: Gib nicht nur getMessage() aus sondern rufe auch printStackTrace() auf - dann siehst Du, wo genau die Exception geworfen wurde (Falls Du irgend was anderes aufrufst und der Fehler gar nicht an der Stelle ist oder so ...)

Bezüglich Datei nicht gefunden: Er sucht im aktuellen Verzeichnis. Vermutlich passt da etwas nicht und die Datei liegt einfach nicht an der richtigen Stelle, weil die IDE bei der Ausführung irgend ein anderes Verzeichnis als Arbeitsverzeichnis nutzt.

Was man immer machen kann: Ausgeben, was genau denn versucht wird zu öffnen:
Java:
System.out.println("Öffne: " + new File("JPoint.txt").getAbsolutePath());
Das gibt dann etwas aus wie:
Öffne: /home/konrad/Projects/JavaTests/JPoint.txt

Dann kannst Du selbst nachsehen, ob da wirklich eine entsprechende Datei liegt oder nicht. Das am Besten auf der Kommandozeile. (Unter Windows der Explorer kann bekannte Dateiendungen ausblenden. Das führt dann ggf. zu Dateien wie JPoints.txt.txt oder so 🙂 )
Tatsächlich, es wird in dem eclipse-workspace Verzeichnis gesucht:

Öffne: C:\Users\***\eclipse-workspace\NetBeansTesting\JPoint.txt
Error: JPoint.txt

Aber warum? Die Datei befindet sich auf dem Desktop. Mit Paths.get muss man auch nicht den Pfad, sondern nur den Namen mit korrekter Erweiterung (z.B. txt) angeben. Was kann ich machen, damit die IDE den Pfad zur Datei finden kann?
 
Java:
try (Scanner scanner = new Scanner(Paths.get("JPoint.txt")))

java.nio.file.NoSuchFileException

Was kann man machen, damit die Datei im ganzen Filesystem gesucht wird?
 
Du kannst Dateien auf Zwei Arten angeben:
a) Absolut. Das bedeutet bei Windows, dass Du den ganzen Pfad angefangen vom Laufwerk, angibst.
b) Relativ: Dann gibst Du die Datei relativ zum aktuellen Verzeichnis an. Ohne jeden Pfad wird die Datei dann im aktuellen Verzeichnis gesucht. Aber du kannst auch Verzeichnisse wechseln also sowas wie ../JPoint.txt um ein Verzeichnis hoch zu kommen.

Üblich sind dabei zwei Taktiken:
a) Der Nutzer wählt die Datei aus - also mit einem Auswahl Dialog kann der Benutzer sagen, welche Datei geöffnet werden soll. Beispiel wäre z.B. das öffnen eines Dokuments bei einer Textverarbeitung. Üblich bei Dokumentenbasierten Programmen.
b) Man gibt einen Ort fest an. Da der Ort von System zu System variable ist, kommen da Environment Variablen ins Spiel. Das kann dann z.B. so aussehen:
Java:
String home = System.getProperty("user.home");
File file = new File(home+"/Downloads/JPoint.txt");
Die erste Zeile holt das das Home Verzeichnis und dann wird so in Downloads die Datei geholt.

Java:
try (Scanner scanner = new Scanner(Paths.get("JPoint.txt")))

java.nio.file.NoSuchFileException

Was kann man machen, damit die Datei im ganzen Filesystem gesucht wird?
Die üblichen Vorgehen habe ich genannt. Was man natürlich machen kann (prinzipiell - aber unüblich für sowas): Du kannst die Filesysteme durchsuchen um dann nach einer Datei zu suchen. Die Klasse file bietet dazu z.B. Methoden wie list(). Da kann man dann immer prüfen:
ist es eine Datei? -> Name prüfen.
Ist es ein Verzeichnis? -> Rekursiv weiter suchen.
 
Du kannst Dateien auf Zwei Arten angeben:
a) Absolut. Das bedeutet bei Windows, dass Du den ganzen Pfad angefangen vom Laufwerk, angibst.
b) Relativ: Dann gibst Du die Datei relativ zum aktuellen Verzeichnis an. Ohne jeden Pfad wird die Datei dann im aktuellen Verzeichnis gesucht. Aber du kannst auch Verzeichnisse wechseln also sowas wie ../JPoint.txt um ein Verzeichnis hoch zu kommen.

Üblich sind dabei zwei Taktiken:
a) Der Nutzer wählt die Datei aus - also mit einem Auswahl Dialog kann der Benutzer sagen, welche Datei geöffnet werden soll. Beispiel wäre z.B. das öffnen eines Dokuments bei einer Textverarbeitung. Üblich bei Dokumentenbasierten Programmen.
b) Man gibt einen Ort fest an. Da der Ort von System zu System variable ist, kommen da Environment Variablen ins Spiel. Das kann dann z.B. so aussehen:
Java:
String home = System.getProperty("user.home");
File file = new File(home+"/Downloads/JPoint.txt");
Die erste Zeile holt das das Home Verzeichnis und dann wird so in Downloads die Datei geholt.


Die üblichen Vorgehen habe ich genannt. Was man natürlich machen kann (prinzipiell - aber unüblich für sowas): Du kannst die Filesysteme durchsuchen um dann nach einer Datei zu suchen. Die Klasse file bietet dazu z.B. Methoden wie list(). Da kann man dann immer prüfen:
ist es eine Datei? -> Name prüfen.
Ist es ein Verzeichnis? -> Rekursiv weiter suchen.
Das hilft mir nicht weiter. Ich verstehe halt nicht, warum die IDE die Datei nicht findet.

Aber vielen lieben Dank trotzdem 🙂
 
Das Konzept von dem Filesystem hast Du aber verstanden?

Hast Du schon einmal auf der Kommandozeile etwas im Filesystem gemacht? Du bist in einem Verzeichnis. Dann funktioniert ein "type JPanel.txt" nur, wenn Du in dem Verzeichnis bist, in dem die JPanel.txt Datei auch ist.
Du kannst es aber auch absolut angeben: type c:\....\JPanel.txt (Natürlich statt den ... den ganzen, richtigen Pfad eingeben!)
Oder Du kannst es relativ angeben. Wenn Du also gerade in Deinem Documents Ordner bist, dann ginge ein type ..\Downloads\JPanel.txt

Bei der Java Applikation ist es nicht anders. Der hat ebenso ein Arbeitsverzeichnis, in dem die Applikation ist. So wie die Eingabeaufforderung...

Aber selbst, wenn Du es nicht ganz verstehst: Code, wie Du an die Datei kommen könntest, hast Du ja nun auch bekommen. Du kannst die Zwei Zeilen ja mal ausführen und file ausgeben. Oder file.getAbsolutPath().
 
Das Konzept von dem Filesystem hast Du aber verstanden?

Hast Du schon einmal auf der Kommandozeile etwas im Filesystem gemacht? Du bist in einem Verzeichnis. Dann funktioniert ein "type JPanel.txt" nur, wenn Du in dem Verzeichnis bist, in dem die JPanel.txt Datei auch ist.
Du kannst es aber auch absolut angeben: type c:\....\JPanel.txt (Natürlich statt den ... den ganzen, richtigen Pfad eingeben!)
Oder Du kannst es relativ angeben. Wenn Du also gerade in Deinem Documents Ordner bist, dann ginge ein type ..\Downloads\JPanel.txt

Bei der Java Applikation ist es nicht anders. Der hat ebenso ein Arbeitsverzeichnis, in dem die Applikation ist. So wie die Eingabeaufforderung...

Aber selbst, wenn Du es nicht ganz verstehst: Code, wie Du an die Datei kommen könntest, hast Du ja nun auch bekommen. Du kannst die Zwei Zeilen ja mal ausführen und file ausgeben. Oder file.getAbsolutPath().
Tja, das Programm liest die Datei, nur wenn ich es in das Arbeitsverz. von eclipse speichere. Meine Frage ist, warum kann die IDE nicht überall auf die gesuchte Datei zugreifen? Muss ich alles in das AVerz. speichern? Das ist doch unsinn.
 
Was hat denn die arme IDE damit zu tun? wenn dein Programm läuft weiß das nix von einer IDE. Wie sollte es sonst später mal auf einem Rechner laufen wo es kein eclipse gibt?
 
Tja, das Programm liest die Datei, nur wenn ich es in das Arbeitsverz. von eclipse speichere. Meine Frage ist, warum kann die IDE nicht überall auf die gesuchte Datei zugreifen? Muss ich alles in das AVerz. speichern? Das ist doch unsinn.
Frage: Hast Du immer alles bei Dir? Also wenn Du im Wohnzimmer bist, dann holst Du aus allen Zimmern aus allen Schränken alle Dinge ... Damit Du dann direkten Zugriff drauf hast? Weil wenn Du ein Getränk trinken willst, dann muss es ja direkt im Zugriff sein!

Oder ist es so: Du weisst, wo das Getränk ist (Haus:\Küche\Kühlschrank\Getränk) und dann ist das auch ok, denn Du kannst ja darauf zugreifen.

Und wenn Du nicht weisst, wo Dein Handy ist: Dann gehst Du von Zimmer zu Zimmer und schaust überall: ist dein Handy da?

Das ist doch hier 1:1 das Gleiche. Die Dateien sind geordnet in Verzeichnisse - so wie Deine Gegenstände auch weggeräumt sind.
Und wenn Du etwas willst, dann holst Du es von dem Ort, wo es ist.

Und so wie Du in unterschiedlichen Räumen (oder Behältern) sein kannst, ist es auch mit dem Programm.

Wenn man weiss, wo man ist, dann kann man relative Pfade angeben: Geh aus dem Zimmer raus, rechts, 5m geradeaus, recht, durch die Tür und dann im Kühlschrank ist das Getränk.
So eine Beschreibung klappt aber nur, wenn der Ort stimmt. Daher kann man da auch absolut angeben: Haus:\Küche\Kühlschrank\Getränk.
So kannst Du sein, wo du willst. Du weisst, wie Du an das Getränk kommen kannst.

Und nein - die IDE kann nichts dafür. Ebenso kann das Fernsehprogramm nichts dafür, dass Du, wenn Du im Wohnzimmer auf dem Sofa sitzt, nicht direkt das Getränk greifen kannst, das im Kühlschrank ist.
 
So sieht es jetzt aus:
Java:
        // File f = new File("C:\\Users\\***\\Desktop\\JPoint.txt");
        // System.out.println("Öffne: " + f.getAbsolutePath());

        Path p = Paths.get("C:\\Users\\***\\Desktop\\JPoint.txt");
        System.out.println("Öffne: " + p.toAbsolutePath());

        try (Scanner scanner = new Scanner(p)) { // oder (f)
            while (scanner.hasNextLine()) {
                String row = scanner.nextLine();
                System.out.println(row);
            }
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("Error: " + e.getMessage());
        }

Vielen Dank nochmal für Hilfe.
 
Pfade am besten immer mit '/' statt mit '\\' schreiben 😉

'\' führt mEn nur zu Fehlern, irgendwann vergisst man mal den zweiten Backslash oder hat plötzlich vier da stehen.
 
Ich empfehle, über die üblichen Umgebungsvariablen oder die System-Properties das Home-Verzeichnis deines Users ermitteln und von dort aus den Pfad zum Desktop weiter angeben.
Dass dein Home-Verzeichnis und somit das Deskop-Verzeichnis in "c:\users\" liegt, ist nämlich nicht garantiert.
[CODE lang="java" title="Windows-Desktop-Verzeichnis"]Path p = Path.of(System.getProperty("user.home"), "Desktop")[/CODE]

Gibt's so ein Desktop-Verzeichnis auch in Linux?
 

Zurück
Oben