# Zugriff auf Datei in Eclipse Projekt



## knowledge (16. Feb 2010)

Hallo,

habe in Eclipse ein Projekt mit der folgenden Struktur:

(1) Projektname: 
         (1.1) src
                 (1.1.1) klasse A
         (1.2) data
                 (1.2.1) test.txt

Wie kann ich nun aus Klasse A auf meine Datei test.txt zugreifen ohne den kompletten absoluten dateipfad ala c:\\eclipse\\worspace usw. angeben zu müssen? Den Pfad zu der Datei benötige ich dann als String


----------



## Tharsonius (16. Feb 2010)

Du solltest ganz einfach mittels

```
File datei1 = new File("data/test.txt");
```
darauf zugreifen können.


----------



## mvitz (16. Feb 2010)

Das ganze funktioniert dann aber wiederum nur, da Eclipse die Anwendung aus Verzeichnis (1) heraus startet. Meiner Meinung nach die beste Lösung:

(1.2) zum Source Folder machen und das File Object folgendermaßen konstruieren:


```
URL url1 = getClass().getClassloader().getResource("test.txt");
File datei1 = new File(url1.toURI());
```


----------



## knowledge (17. Feb 2010)

Danke für eure Hilfe. Den data Ordner möchte ich jedoch nicht zum Source Folder machen, sondern den Quellcode weiterhin in src belassen. Gibts dann trotzdem ne Lösung über den Classloader?


----------



## mvitz (17. Feb 2010)

Nein, da du über den Classloader nur an Sachen kommst, die im Classpath sind (und das ist bei Eclipse alles, was sich in Source Foldern befindet). Du musst jetzt das Data auch nicht in den src Ordner packen, du kannst einfach den data als 2ten Source Folder definieren (Rechtsklick auf data --> Build Path --> Use as source folder).

Ansonsten wäre noch die Frage, wieso du nicht möchtest, dass data ein Source Folder wird.


----------



## knowledge (17. Feb 2010)

Aha. Den die Lösung mit new File...data funktioniert so bisher nicht...


----------



## knowledge (17. Feb 2010)

Also wenn in meinem Eclipse Projekt ein Ordner source ist und ein anderer Ordner data in dem Bilder usw. liegen dann muss ich den Data Ordner als Source Ordner "markieren" und über den classloader drauf zugreifen. Anders komme ich also nicht an die Inhalte von data ran?


----------



## mvitz (17. Feb 2010)

Innerhalb von Eclipse könnte es dann auch mit

```
File file = new File("../data/test.txt");
```
funktionieren. Aber sobald man dann außerhalb von Eclipse arbeitet, bekommt man Probleme.
Der Konstruktor von File geht bei einem String als Parameter immer vom aktuellen Ausführungsverzeichnis aus. Dieses hängt jedoch stark davon ab, wie jemand letztendlich dein Programm aufruft, ist deshalb nicht zuverlässig.

Eclipse nutzt als Ausführungsverzeichnis entweder deine (1) oder das Verzeichnis wohin Eclipse automatisch kompiliert (1)/bin als Default. Aus diesem Grunde ist es eigentlich normal, alles, was man laden muss und mit ausliefert in einen Source Folder zu packen und es anschließend über den Classloader zu laden.


----------



## Firestorm87 (17. Feb 2010)

Müssen / Sollen die Daten denn überhaupt mit im Jar-File liegen?
wenn diese eh extern angesiedelt sein sollen, dann könnte man genau so (s.O.) vorgehen....


----------



## maki (17. Feb 2010)

Die "Lösung" mit java.io.File ist imho pfusch.

Das sind Classpathressourcen, also sollten sie auch im Classpath liegen.
Ist nicht ungewöhnlich dass man sich mind. 2 Ordnerstrukturen anlegt, einmal für Java Sourcen und dann für Ressourcen.
Maven2 macht sogar 4 Ordner draus, Javasource, Ressourcen, Testsource, Test-Ressourcen.
Was dann im Jar endet lässt sich einfach konfigurieren, Maven2 lässt zB. die Testsourcen & Test Ressourcen weg.


----------



## mvitz (17. Feb 2010)

Und auch, wenn bestimmte Dinge bei der Auslieferung nicht mit im JAR sein sollen, aber mit ausgeliefert werden. So kann man diese beim Starten (per .bat, .sh oder Manifest) auch mit in den Classpath aufnehmen.


----------



## OasisCritter (17. Apr 2010)

mvitz hat gesagt.:


> Das ganze funktioniert dann aber wiederum nur, da Eclipse die Anwendung aus Verzeichnis (1) heraus startet. Meiner Meinung nach die beste Lösung:
> 
> (1.2) zum Source Folder machen und das File Object folgendermaßen konstruieren:
> 
> ...



Diese Variante klappt bei mir aber nur in Eclipse, außerhalb funktioniert es nicht. Siehe mein Problem:
http://www.java-forum.org/java-basics-anfaenger-themen/97526-vokabel-trainer-2.html#post629261

MfG


----------

