2013-05-01 7 views
7

Ich habe die folgende Struktur für mein Projekt.Dateipfad oder Dateipfad für Java - neue Datei()

in Eclipse:

myPorjectName 
    src 
    com.example.myproject 
     a.java 
    com.example.myproject.data 
     b.xml 

In a.java möchte ich b.xml Datei lesen. Wie kann ich das machen? Insbesondere in a.java, habe ich den folgenden Code:

DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); 
Document doc = docBuilder.parse (new File("data/b.xml")); 

Dieser Code nicht b.xml finden. Wenn ich jedoch den Pfad zu src/com/example/myproject/data/b.xml ändere, funktioniert es. Der aktuelle Speicherort scheint im Stamm meiner Projektdatei zu liegen.

Aber ich sehe andere Beispiele von Menschen, wenn b.xml und a.java im selben Ordner befinden, dann direkt new File("b.xml") verwenden wir können. Aber ich versuche b.xml in den gleichen Ordner von a.java anstatt in den Unterordner setzen, aber es funktioniert immer noch nicht funktioniert. Wenn das funktioniert, dann sollte ich in der Lage sein, new File("data/b.xml") zu verwenden, oder? Ich verstehe wirklich nicht, warum das nicht funktioniert.

+2

Es ist höchstwahrscheinlich eher wie 'getClass() sein würde getResourceAsInputStream ("/ com/example/myproject/data/b.xml");.' – MadProgrammer

+0

Es funktioniert nicht, weil Ihr ** Standardverzeichnis (das Java wird ausgeführt von) ** ist 'myPorjectName' Es ist nicht in' myproject' – xagyg

+0

xagyg und MadProgrammers Kommentare lassen mich verstehen, warum ich es falsch gemacht habe. Danke Jungs. Die folgende Antwort bringt mich dazu, etwas mehr zu lernen. – Joey

Antwort

17

Wenn es bereits in der Classpath ist und im selben Paket, verwenden

URL url = getClass().getResource("b.xml"); 
File file = new File(url.getPath()); 

OR, lesen Sie es als InputStream:

InputStream input = getClass().getResourceAsStream("b.xml"); 

Innerhalb eines static Methode können Sie verwenden

Wenn sich Ihre Datei nicht im selben Paket wie die Klasse befindet, die Sie versuchen zu akkumulieren Nimm die Datei von, dann musst du ihr einen relativen Pfad geben, beginnend mit '/'.

ex : InputStream input = getClass().getResourceAsStream 
      ("/resources/somex.cfg.xml");which is in another jar resource folder 
+0

Ich denke, das ist der beste Weg! – buch11

+0

Was ist, wenn es nicht im selben Paket ist? In meinem Beispiel befindet sich a.java in com.example.myproject. b.xml befindet sich in com.example.myproject.data. – Joey

+1

Ich habe die Antwort bearbeitet. – NINCOMPOOP