# Java kann Dateipfad nicht öffnen



## Developer_X (24. Nov 2016)

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 

```
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.

```
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


----------



## Developer_X (24. Nov 2016)

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.


----------



## KeVoZ_ (24. Nov 2016)

Und die Java Version?

EDIT: Wo liegt die Datei denn?


----------



## Robat (24. Nov 2016)

Sobald du dein Programm in eine Jar umwandelst ist dein File ein `classPathResource`.
D.h. du musst entweder:

```
this.getClass().getResourceAsStream("PATH/TO/THE/FILE");
```

oder (falls deine Methode static ist):

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

nehmen 

Gruß
Robert


----------



## Developer_X (24. Nov 2016)

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


----------



## dennisbauer (24. Nov 2016)

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 
	
	
	
	





```
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


----------



## Developer_X (24. Nov 2016)

Also jetzt kriege ich nur noch Fehlermeldungen...

```
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...");
        }  
    }
}
```


```
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.)


----------



## dennisbauer (24. Nov 2016)

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


----------



## InfectedBytes (24. Nov 2016)

dennisbauer hat gesagt.:


> ... bzw. im Workspace eben unter src/main/resources , ansonsten wird das nicht gehen


Das kommt auf die IDE an.


----------



## JStein52 (24. Nov 2016)

ich denke gerade verschlimmbesserst du das Ganze. Es geht doch nur darum warum er auf einigen PC's den Separator nicht richtig expandiert !


----------



## Developer_X (25. Nov 2016)

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?


----------



## mrBrown (25. Nov 2016)

Developer_X hat gesagt.:


> Wie kann ich sichergehen, dass der Separator richtig eingestellt wird?


Indem du `/` nutzt, die JVM kümmert sich drum.


----------



## Developer_X (25. Nov 2016)

Hast du überhaupt meine Frage / den ersten Post im Thread gelesen?


----------



## Robat (25. Nov 2016)

Developer_X hat gesagt.:


> auf eine
> Datei die in einem Unterordner resources liegt, mit dem Namen "language.dat".



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?



Developer_X hat gesagt.:


> Ich habe doch gesagt, dass der Ordner und die Datei außerhalb


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.


----------



## JStein52 (25. Nov 2016)

Aber Jungs, das Problem war doch nicht dass die Datei in einem anderen Pfad war sondern dass der Pfad keine Separator's enthielt !


----------



## mrBrown (25. Nov 2016)

Developer_X hat gesagt.:


> Hast du überhaupt meine Frage / den ersten Post im Thread gelesen?


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 (25. Nov 2016)

mrBrown hat gesagt.:


> Lass dir testweise mal mit file.getAbsolutePath() den Dateipfad, den du versuchst zu öffnen, ausgeben


Auf dem PC deines Freundes


----------



## Neumi5694 (29. Nov 2016)

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...


----------

