Dateipfade mit Packages

frostbyte

Aktives Mitglied
Hallo,

Ich habe ein Package de.meinname, in dem liegt eine Klasse, die Lokalisierungen übernimmt, also ich frage, nach einem String für xy und es gibt mir einen String zurück:
Java:
public class Spr {
	static ResourceBundle B = ResourceBundle.getBundle("sprache");
	
	public static String get(String ident) {
		return B.getString(ident);
	}
}

Bisher hatte ich die Datei in jedem Projekt einzeln, und da ich immer das standard-Package benutzt habe, gab es nie Probleme.

Jetzt habe ich jedoch diese Spr-Klasse in dem einen Package, die Dateien sind aber in dem anderen Package, eclipse hat die Datei jetzt unter de/meinname/kategorie/programm/sprache_de.properties und die Klasse Spr findet das jetzt nicht.

Ähnliche Probleme habe ich in Teilen, in denen Bilder geladen werden sollen:
Java:
wandI = javax.imageio.ImageIO.read(cl.getResource("wand.gif"));

Mit dem Standardpackage klappte das wunderbar, nur jetzt geht das nicht mehr.

Wie mache ich das jetzt richtig?
 
die Dateien müssen in das Verzeichnis der Klasse wie du schon halb erkannt hast, was ist dabei dann die Frage?

alternativ kannst du noch versuchen, den Pfad entsprechend anzupassen
ResourceBundle.getBundle("kategorie/programm/sprache");
 
Die sind schon im Verzeichnis der Klasse, aber dort werden sie nicht gefunden. Ich könnte die natürlich so anpassen, aber geht das nicht irgendwie eleganter, dass der direkt in seinem Package-Ordner schaut?
 
> Die sind schon im Verzeichnis der Klasse

wie passt das zu den vorherigen Aussagen
> Ich habe ein Package de.meinname, in dem liegt eine Klasse
+
> die Datei jetzt unter de/meinname/kategorie/programm/sprache_de.properties

das sieht doch so aus als wären Klasse + Datei in unterschiedlichen Verzeichnissen, einmal
de/meinname
und einmal
de/meinname/kategorie/programm
 
Ich würde die Klasse gerne zentral verwenden, für alle Programme, und für jedes Programm dann eigene Sprachdatei schreiben. Der Klasse müsste ich eventuell noch übergeben, welches Programm anfragt.

Wie komme ich denn an meine Daten, so, dass es auf allen Systemen funktioniert?
 
das ResourceBundle kann der allgemeinen Spr-Klasse ja als Parameter übergeben werden,
wird zu irgendeiner Klasse geladen, die programmspezifisch ist, eine wirds doch mindestens geben,

oder diese spezifische Klasse wird an Spr übergeben,

aber ich sehe gerade dass ResourceBundle.getBundle("sprache"); gar nicht die Klasse als Parameter erhält wie es bei
> cl.getResource("wand.gif")
ja der Fall ist,
ich denke langsam ich sollte dazu keine weiteren Vermutungen anstellen, ich verwende das selber auch nicht,

entweder bei google nach Beispielen suchen oder jemand anders antwortet hier oder in einem neuen Thema 'Umgang mit RessourceBundle'
 
Gut, das mit der Spr-Klasse mache ich dann ein andermal.

Aber wenn ich beispielsweise eine Textur laden möchte, dann muss ich das mit
Java:
ClassLoader cl …
cl.getResource("de/meinname/kategorie/programm/wand.gif");
machen?

Oder kann ich das "wand.gif" auch irgendwie im Kontext des aktuellen Packages laden, dass ich das auch in den Packages verschieben könnte, ohne dass die Pfade nicht mehr stimmen?
 
was ich weiß ist, dass bei class.getResource(pfad) relativ zum passenden Verzeichnis des packages gesucht wird,

schnell nachgeschaut landet der Aufruf auch bei ClassLoader.getResource(),
und zwar indem der Pfad angepasst wird

Java:
    /**
     * Add a package name prefix if the name is not absolute Remove leading "/"
     * if name is absolute
     */
    private String resolveName(String name) {
        if (name == null) {
            return name;
        }
        if (!name.startsWith("/")) {
            Class c = this;
            while (c.isArray()) {
                c = c.getComponentType();
            }
            String baseName = c.getName();
            int index = baseName.lastIndexOf('.');
            if (index != -1) {
                name = baseName.substring(0, index).replace('.', '/')
                    +"/"+name;
            }
        } else {
            name = name.substring(1);
        }
        return name;
    }

viel gibts da also nicht zu verstehen,
ClassLoader bestimmt die Menge der Grundverzeichnisse im Dateisystem, evtl. gar Jar-Dateien, in denen gesucht wird,

übergeben wird ein absoluter oder relativer Pfad,
wenn man eine Class-Datei dazwischenpackt wird dessen package mit eingebaut,
ansonsten kann man das ja auch mehr oder weniger selber machen, z.B. obige Methode kopieren,

wo die Dateien sind sollte man aber schon wissen,
rekursiv beliebige Verzeichnisbäume werden hier nicht durchsucht, das müsste man selber programmieren
 

Zurück
Oben