Directory zur Laufzeit laden(executable Jar)

hesk

Erfahrenes Mitglied
Hallo!

Ich erstelle ein executable Jar und hab innerhalb einen Ordner mit Files.
Jetzt würde ich gerne wenn ich das Programm starte die Files bekommen.
Wenn ich es in Eclipse ausführe funktioniert es prima.
Nur wenn ich das Jar selber ausführe geht es leider nicht.

Hier wie ich es schon probiert habe:

Java:
URL fontUrl = FindokHelperMain.class.getResource("resources/Fonts/");
File directory = new File(fontUrl.toURI());
System.out.println(directory.getAbsolutePath());
System.out.println("fonts: " + directory.list().length);

und

Java:
            InputStream fontDirectory = FindokHelperMain.class.getResourceAsStream("resources/Fonts/");
           BufferedReader rdr = new BufferedReader(new InputStreamReader(fontDirectory));
            
           String line;
            while ((line = rdr.readLine()) != null) {
               System.out.println("file: " + line);

Beides liefert keine Treffer wenn ich das Jar ausführe
 
Da ich mal annehme, dass es immer noch um deine Fonts geht, die du laden willst, ist es immer noch der gleiche Code den ich dir vorhin auch schon gezeigt habe (denke ich).
Java:
InputStream is = FindokHelperMain.class.getResourceAsStream("resources/Fonts/deineFontDatei.ftt");
font = Font.createFont(Font.TRUETYPE_FONT, is);
Natürlich musst du bei dem Resourcenpfad noch einen Dateinamen mit angeben, sonst funktioniert das eh nicht.
Oder was willst du jetzt?
 
Ja, es geht noch um das. Ich will jetzt die Fonts nicht alle einzeln angeben müssen, sondern dass er gleich alle ladet welche im Verzeichniss sich befinden.

Dein Code liefert leider ein FontFormatException.

Leider erkennt er zur Laufzeit(wenn man das executable Jar ausführt) nicht, dass Fonts ein Verzeichniss innherlab des Jars ist.
 
Weil sich der ResourceAsStream immer (wie der Name schon sagt) auf eine Resource (File, Zip, etc.) bezieht und nicht auf ein Verzeichnis. Ich hab bisher noch nichts davon gehört, dass man auch Verzeichnisse über den ResourceAsStream laden kann.
Von daher wirst du wohl oder übel deine Files so angeben müssen.

Und die FontFormatException wird wahrscheinlich deshalb geschmissen, weil die Datei nicht der einer Font-Datei-Formatierung entspricht.
 
Ja, das ist mir klar.

Drum war auch hier meine Frage, ob es eine Möglichkeit gibt alle Files in einem Directory in einem Jar zur Laufzeit zu bekommen?

Denn dann habe ich die Namen und kann sie einzeln mit ResourceAsStream laden.
 
Wie gesagt, was du machen kannst, du kannst die Font-Dateien alle in eine Zip-Datei packen und diese dann über den ResourceAsStream laden. Dann brauchst du da nur eine Datei an zu geben und kannst alle Font-Dateien dann über ZipEntry (oder so ähnlich) laden.
 
Ich versteh dein Problem nicht. Mal davon abgesehen das es immer noch um das gleiche Thema geht und es daher eigentlich immer noch in den selben Thread gehört ... es also eigentlich nicht gerade schön ist das du jetzt über zwei Threads verteilt über das selbe Problem schreibst ... ist es doch egal ob du nun mit einer Datei oder einem Verzeichnis ein File-Objekt erzeugst.

Um dein Problem zu lösen muss man etwas kreativer als nur getResource() sein.

Java:
private String setPath()
{
	StringBuilder sb=new StringBuilder();
	String urlPATH=this.getClass().getResource(this.getClass().getSimpleName()+".class").toString();
	int numChars=urlPATH.length(), i=0;
	char c;
	while(i<numChars)
	{
		c=urlPATH.charAt(i);
		switch (c)
		{
			case '%':
				sb.append(new String(new byte[] { (byte)Integer.parseInt(urlPATH.substring(i+1, i+3), 16) }));
				i+=3;
				break;
			default:
				sb.append(c);
				i++;
				break;
		}
	}
	String PATH=sb.toString();
	if(PATH.contains("!"))
		PATH=PATH.substring(0, PATH.indexOf("!"));
	PATH=(new File(PATH.substring(PATH.indexOf("/"), PATH.length()))).getAbsolutePath();
	return PATH;
}

Ich hab jetzt diese Methode einfach mal aus meinem Projekt genommen und entsprechend angepasst. Die Funktion ist einfach : du bekommst einen ABSOLUTEN Pfad zum JAR-File. Diese Methode hat mir viel Zeit gekostet ... ist aber auf sehr vielen Systemen zuverlässig *getestet !*. Jetzt erstellst du einfach ein JarFile-Objekt mit dem returnten Pfad und gehst durch die einzelnen ZipEntry durch. Dann musst du nur noch prüfen ob der Name des Verzeichnisses im Namen auftaucht und das du nicht dierekt das Verzeichnis selbst erwischt hast ... und dann innerhalb des Iterator einfach alles laden.

Wenn deine Daten allerdings nicht dem Format entsprechen was Java erwartet hilft dir das alles nichts.

1) Erwarte NICHT das ich dir das jetzt zusammenbaue.
2) Versuche bitte in Zukunft thematisch zusammenhängende Problem in EINEM Thread zu sammeln ...
 
Hey!

Erstmal danke für die ausführliche Antwort.
Warum ich einen extra Thread erstellt habe ist einfach und logisch: Es sind zwei Probleme.
Das eine Problem behandelt wie man einen Font zur Laufzeit ladet.
Das andere Problem(dieser Thread) behandelt wie man ein bestimmtes Directory(die Einträge darin) aus einem Jar zur Laufzeit bekommt.

Auf einzelne Files kann mittels getResourceAsStream zugegriffen werden.
Dies setzt aber voraus dass man genau ein File möchte.
Wenn man nun die Namen aller Files in einem Directory haben möchte, geht dies nicht so einfach.

Das man das Jar entzippen und alle Directories nach dem richtigen durchsuchen könnte stimmt schon.
Ich dachte nur es ginge auch mittels dem Classloader.
 
Beide Probleme hängen dennoch zusammen da es bei dir immer noch um das Laden der Font-Files geht ... du drehst es gerade blos so hin als ob es zwei eigentständige Probleme wären ...

Du musst das Jar nicht entpacken ... du musst nur lediglich auf das Jar als solches zugreifen und dann damit wie mit einem normalen Jar umgehen ... aber NUR mit ClassLoader ist es dir nur möglich dierekte Dateien anzugeben ...
 
Für mich ist es ein Problem. Für andere sind es zwei Punkte. Ein user der nach directory und jar sucht sollte einen Thread mit Fonts finden.
 
Zurück