Java kann Dateipfad nicht öffnen

Dieses Thema Java kann Dateipfad nicht öffnen im Forum "Allgemeine Java-Themen" wurde erstellt von Developer_X, 24. Nov. 2016.

Thema: Java kann Dateipfad nicht öffnen Sehr geehrtes Forum, ich habe folgendes Problem: Mein Programm benötigt Zugriff (ganz normal mit BufferedReader) auf...

  1. Sehr geehrtes Forum,
    ich habe folgendes Problem:
    Mein Programm benötigt Zugriff (ganz normal mit BufferedReader) auf eine
    Datei die in einem Unterordner resources liegt, mit dem Namen "language.dat".

    Also öffne ich die Datei zum Lesen
    Code (Java):
    File f = new File("resources/language.dat");
    BufferedReader br = new BufferedReader(new FileReader(f));
    //...
    Auf meinem PC funktioniert das Programm auch, auch wenn ich es exportiere
    als Jar und irgendwo auf der Festplatte gemeinsam mit Resourcen Ordner ablege.

    Wenn ich nun mein Programm mit den Resourcen an einen Freund sende,
    dann bekommt er die Fehlermeldung, dass das Programm auf folgende Datei zugreifen will,
    die ja dann natürlich nicht existiert :
    resourceslanguage.dat

    Das Programm lässt auf seinem PC einfach die "/" weg.
    Also habe ich recherchiert und herausgefunden, man sollte, um Programme
    plattformunabhängig laufen zu lassen, statt "/" lieber "System.getProperty("file.separator")"
    verwenden.
    Code (Java):
    File f = new File("resources"+System.getProperty("file.separator")+"language.dat");
    BufferedReader br = new BufferedReader(new FileReader(f));
    //...
    Den Code habe ich daraufhin angepasst, aber das Programm macht weiterhin
    denselben Fehler auf seinem PC.

    Was kann ich tun, damit das Programm auch dort fehlerfrei funktioniert?
    Danke sehr für eure Antwort,
    m.f.G.: Developer_X
     
  2. Vielleicht hilft dir das Grundlagen Training weiter --> *Klick*
  3. Und das verrückteste an allem, wir benutzen beide dasgleiche
    Betriebssystem, Windows 7 64 Bit.

    Das Problem habe ich aber auch schon bei anderen Freuenden erlebt.
     
  4. Und die Java Version?

    EDIT: Wo liegt die Datei denn?
     
  5. Sobald du dein Programm in eine Jar umwandelst ist dein File ein classPathResource.
    D.h. du musst entweder:
    Code (Java):

    this.getClass().getResourceAsStream("PATH/TO/THE/FILE");
     
    oder (falls deine Methode static ist):
    Code (Java):

    className.class.getResourceAsStream("PATH/TO/THE/FILE");
     
    nehmen :)

    Gruß
    Robert
     
    Zuletzt bearbeitet: 24. Nov. 2016
    VfL_Freak gefällt das.
  6. Aber die Datei und der Ordner sind extern von der Jar,
    nicht in der Jar drin. Dann muss man doch nicht getResourceAsStream
    verwenden oder nicht?
    Mein Java Programm liegt als Jar in einem Ordner,
    und dazu liegt noch den Order mit den Dateien imselben Verzeichnis.

    Und ohne etwas zu tun funktioniert es an einigen PCs (das habe ich getestet, mit 30 Personen),
    und bei anderen wiederum nicht.

    Java Version bei meinem Freund: Java 8 / 111
     
  7. am einfachsten ist, wenn du, so wie du sagst, die externe Datei außerhalb des Classpath auch als File aufrufst. Ein FileInputStream ginge natürlich auch. Das Problem, dass ich das aktuelle Verzeichnis nicht adressieren konnte hatte ich auch bereits.

    Um das aktuelle Verzeichnis, in dem die JAR ausgeführt wird, herauszufinden, kannst du einfach mithilfe von
    Code (Text):
    System.getProperty("user.dir");
    das aktuelle Verzeichnis ausgeben lassen. Dahinter folgen dann ganz normal deine Dateipfade. Den Seperator kann ich dir anmerken, mit der statischen Variable File.separator geht es einfacher ;)
     
  8. Also jetzt kriege ich nur noch Fehlermeldungen...
    Code (Java):
    package main;

    import java.awt.BorderLayout;
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.InputStream;
    import java.io.InputStreamReader;

    import javax.swing.JFrame;
    import javax.swing.JTextArea;

    public class Test
    {
        public static void main(String[]args)
        {      
            JFrame f = new JFrame("Java Datei Lesen Test");
         
            f.setSize(400,600);
            f.setLocationRelativeTo(null);
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         
            f.setLayout(new BorderLayout());
            JTextArea jta = new JTextArea();
            f.add(jta,"Center");
         
            f.setVisible(true);
         
            jta.setText("Aktuelles Verzeichnis : "+System.getProperty("user.dir")+"\n"
                       +"Versuche Datei \""+"folder"+File.separator+"File.txt"+"\" zu öffnen...\n");
         
            try
            {
                InputStream is = Test.class.getResourceAsStream("folder"+File.separator+"File.txt");
             
                BufferedReader br = new BufferedReader(new InputStreamReader(is));
                String line = br.readLine();
                br.close();

                jta.setText(jta.getText()+"Zugriff erfolgreich :)...\nInhalt : "+line);
            }
            catch(Exception e)
            {
                e.printStackTrace();
                jta.setText(jta.getText()+"Hat nicht geklappt...");
            }  
        }
    }
     
    Code (Text):
    java.lang.NullPointerException
        at java.io.Reader.<init>(Unknown Source)
        at java.io.InputStreamReader.<init>(Unknown Source)
        at main.Test.main(Test.java:35)
     
    (Es gibt einen Ordner namens "folder", in dem eine Datei "file.txt" liegt.)
     
  9. Deine Lösung kann aber nur dann funktionieren, wenn dieser ORdner "folder" auch in deinem Classpath also in deiner Jar-Datei drin ist bzw. im Workspace eben unter src/main/resources , ansonsten wird das nicht gehen
     
  10. Das kommt auf die IDE an.
     
  11. ich denke gerade verschlimmbesserst du das Ganze. Es geht doch nur darum warum er auf einigen PC's den Separator nicht richtig expandiert !
     
  12. JA genauso sehe ich das auch.
    Ich habe doch gesagt, dass der Ordner und die Datei außerhalb
    der JAR liegen.

    Wie kann ich sichergehen, dass der Separator richtig eingestellt wird?
     
  13. Indem du / nutzt, die JVM kümmert sich drum.
     
  14. Hast du überhaupt meine Frage / den ersten Post im Thread gelesen?
     
  15. Hast du den resources Folder denn auch zu deinem Classpath hinzugefügt?
    Oder ist der Order garnicht in das Projekt involviert sondern liegt einfach nur irgendwo auf dem PC rum?

    Du musst aber auch sicher stellen, dass die Dateien auf den beiden Rechnern am gleichen Ort liegen. Wenn sie bei dir Unter C:/Users/home/resources/.. und bei deinem Freund unter D:/Files/Foo/Bar/resources/.. liegt dann ist klar dass dein Programm den Ordner nicht findet.
    Damit du einen einheitlichen Path hast würde ich dir empfehlen deinen Path mit System.getProperty("user.dir"); zuerstellen, so wie @dennisbauer es schon gesagt hatte.
     
  16. Aber Jungs, das Problem war doch nicht dass die Datei in einem anderen Pfad war sondern dass der Pfad keine Separator's enthielt !
     
  17. Ja, das hat aber (vermutlich) nichts mit dem korrektem Seperator zu tun, die Versuche mit File.seperator und SystemProperty machen's nur noch schlimmer.

    Lass dir testweise mal mit file.getAbsolutePath() den Dateipfad, den du versuchst zu öffnen, ausgeben
     
    JStein52 gefällt das.
  18. Auf dem PC deines Freundes
     
  19. Was den Separator angeht ... bleib bei "/". Das funktoniert sowohl unter Windows als auch Unix, Java nimmt notwendige Konvertierungen selbst vor.
    Lass auch mal System.getProperty("file.separator") ausgeben. Was du ganz oben und auch schon im zweiten Versuch schon gepostet hast, ist zwar nicht die eleganteste aller Lösungen, sollte aber funktionieren.

    Es mag etwas unwahrscheinlich klingen, aber ich denke, Java kennt den Separator nicht, da er sowohl fehlt, wenn du "/" verwendest als auch dann, wenn du den Pfad manuell mit eben jener Variable erstellen lässt.
    Möglicherweise ist bei deinem Freund die Java-Installation im A...
     
  20. Kostenloses Java-Grundlagen Training im Wert von 39 €
    Schau dir jetzt hier das Tutorial an und starte richtig durch!