Leerzeichen und Umlaute im Pfad einer Java Applikation machen Probleme

osix

Bekanntes Mitglied
Hallo,

ich hole mir zur Laufzeit mit folgendem Befehl den Installationspfad, weil unterhalb diesem Dateien liegen, die ich lesen muß.

Code:
 String path=Programmname.class.getProtectionDomain().getCodeSource().getLocation().toString();

Wenn jetzt Leerzeichen oder Umlaute (ä ü ö ß) im Pfad sind, gibt es einen Fehler, weil die nicht korrekt zurückgegeben werden, sondern mit "%%20" oder ähnliche Zeichen.

Wie kann ich den Pfad korrekt holen ?
 

kneitzel

Top Contributor
Das ist doch auch klar, denn getLocation gibt keinen Pfad sondern eine URL zurück. Siehe diesbezüglich https://docs.oracle.com/javase/9/docs/api/java/security/CodeSource.html#getLocation--

Daher ist die Frage, was Du da genau erwartest / machen möchtest. URL hat z.B. ein getPath als Methode. Aber Dir sollte bewusst sein, dass die URL einiges sein kann und das getPath() da nicht unbedingt immer Sinn macht ... (bei http://some.domain/some/path wäre es /some/path. Aber Du gehst wohl davon aus, dass es immer lokale Dateien sind ... daher könnte es das sein, was Du möchtest ...)
 

mrBrown

Super-Moderator
Mitarbeiter
ich hole mir zur Laufzeit mit folgendem Befehl den Installationspfad, weil unterhalb diesem Dateien liegen, die ich lesen muß.
Müssen die Dateien denn wirklich dort liegen?

Oftmals sind die besser in der Jar oder im aktuellem Arbeitsverzeichnis aufgehoben. Falls die wirklich neben der Jar liegen müssen, ist es meist sinnvoll, den Pfad dann durch ein Start-Skript der Jar zu übergeben.
 

Thallius

Top Contributor
Mal ganz davon abgesehen, dass wenn die Daten um gleichen Verzeichnis wie die .jar liegen du auch einfach mit einem relativen Pfad drauf zugreifen kannst und dir das Ganze geraffelt sparen.
 

mrBrown

Super-Moderator
Mitarbeiter
Mal ganz davon abgesehen, dass wenn die Daten um gleichen Verzeichnis wie die .jar liegen du auch einfach mit einem relativen Pfad drauf zugreifen kannst und dir das Ganze geraffelt sparen.
Nein, kann man nicht. Relativer Pfad ist relativ zum aktuellem Arbeitsverzeichnis, nicht zum Pfad zu irgendeiner Jar.
 

kneitzel

Top Contributor
Nein, kann man nicht. Relativer Pfad ist relativ zum aktuellem Arbeitsverzeichnis, nicht zum Pfad zu irgendeiner Jar.
Ja, das ist richtig. Aber die URL ist auch nicht zwangsläufig etwas, womit er etwas anfangen kann. Prinzipiell muss die so lokal liegen und das ist eine Voraussetzung an die Applikation, die so nicht zwingend gegeben ist.

Ich weiss jetzt nicht, wie es bei GraalVM aussieht, da ich dies noch nicht benutzt habe. Bei jar2exe in der Vergangenheit geht dieser Weg schlicht nicht. Wenn GraalVM die jar auch mit in die EXE packt, dann kann es da auch ähnlich sein.

Aber bei dem Vorhaben ist eh genau zu analysieren, was das für Dateien sind:
- Sind diese Bestandteil der Applikation selbst, dann sollten diese ggf. wie Ressourcen behandelt werden. Dann entfällt diese Problematik.
- Wenn da Dateien auch geschrieben werden, dann sollte man sich ein besseres Verzeichnis suchen. Spätestens, wenn man ein Produkt daraus macht, dann ist die Chance durchaus nicht gering, dass es irgendwohin installiert wird. Und dann hat der User keine Schreibrechte mehr (Dann liegt es in /usr/local oder c:\Program Files oder so.)

Daher sollte man sich überlegen, was man da genau machen möchte.

Wenn ich die .jar dort starte wo sie liegt ist es das Arbeitsverzeichnis
Das ist aber oft nicht der Fall. gradle assemble generiert Startscripte in einem anderen Verzeichnis, jlink erstellt eine Verzeichnis Hierarchie.... Also ist das nicht zwingend gegeben.

Ich überlege gerade, ob man die Dateien nicht auch über den ClassLoader laden kann, wenn man den Classpath noch zusätzlich setzt? Also im Manifest Class-Path: ./somefolder/ oder so. Könnte das funkitionieren? Ist das nicht relativ zum jar File?
 

osix

Bekanntes Mitglied
Danke hab's gelöst !


String path=SQuitt8.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath();

so ging es !

Dann krieg ich zwar noch den Dateinnamen mit, aber den schneide ich einfach weg...
 

mrBrown

Super-Moderator
Mitarbeiter
Ja, das ist richtig. Aber die URL ist auch nicht zwangsläufig etwas, womit er etwas anfangen kann. Prinzipiell muss die so lokal liegen und das ist eine Voraussetzung an die Applikation, die so nicht zwingend gegeben ist.
Deshalb meine vorherige Antwort ;)

Ich weiss jetzt nicht, wie es bei GraalVM aussieht, da ich dies noch nicht benutzt habe. Bei jar2exe in der Vergangenheit geht dieser Weg schlicht nicht. Wenn GraalVM die jar auch mit in die EXE packt, dann kann es da auch ähnlich sein.
Mit native-image gibts danach keine Jar mehr, das funktioniert gänzlich anders als jar2exe u.ä. Ich würde nicht davon ausgehen, dass es so funktioniert.
 

mrBrown

Super-Moderator
Mitarbeiter
Genau anders herum. Wenn ich ein Programm, egal welcher Art, in einem Verzeichnis starte, dann ist dieses das Arbeitsverzeichnis solange ich dieses nicht explizit in dem Programm anders setze.
Wenn man im Terminal explizit in das Verzeichnis wechselt (= "das Arbeitsverzeichnis vorher passend setzt") und es dort startest, dann ist das so.

In allen anderen Fällen allerdings nicht. Sei es weil man es über Doppel-Klick startet, oder weil eine der von @kneitzel genannten Varianten nutzt, oder wie auch immer man es startet.
In den meisten Fällen will man Arbeits- und Installationsverzeichnis auch ganz explizit trennen.

EDIT: Hier, zum Testen unter Linux und Mac:
Bash:
#!/bin/sh
echo "Working dir: $(pwd)"

Irgendwo anders als im Home-Verzeichnis speichern (unter Mac mit .command als Endung), ausführbar machen und über Doppelklick starten. Ausgegeben wird das Home-Verzeichnis.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Umlaute umwandeln bekomme nur Leerzeichen raus. Allgemeine Java-Themen 11
J Datei löschen, die Leerzeichen im Pfad hat Allgemeine Java-Themen 5
Joker4632 Klassen Buffered Reader liest die Leerzeichen am Zeilen Ende nicht mehr Allgemeine Java-Themen 2
L Leerzeichen zu string hinzufügen, um eine gerade zahl zu erhalten Allgemeine Java-Themen 9
M Sortieren und Leerzeichen Allgemeine Java-Themen 11
K Input/Output störende Leerzeichen entfernen Allgemeine Java-Themen 11
Guybrush Threepwood Pattern gesucht: Punkt ohne Leerzeichen dahinter Allgemeine Java-Themen 3
H RegEx - Ersetze alles bis Leerzeichen Allgemeine Java-Themen 5
R Arrayausgabe enthält viele Leerzeichen Allgemeine Java-Themen 4
F Replace von Leerzeichen Allgemeine Java-Themen 8
reibi String Manipulation - Leerzeichen Allgemeine Java-Themen 7
S Wörter ohne Leerzeichen erkennen Allgemeine Java-Themen 5
M itext Leerzeichen am ende unterstreichen Allgemeine Java-Themen 4
M Input/Output Pfad mit Leerzeichen convertieren in Kurzschreibweise (~1, ~2, etc)? Allgemeine Java-Themen 10
E Leerzeichen verschwinden beim Einlesen von .txt-Dateien Allgemeine Java-Themen 5
O split mit einem ODER mehrere Tabulatoren oder Leerzeichen Allgemeine Java-Themen 6
M Batch ausführen mit Leerzeichen im Pfad Allgemeine Java-Themen 7
G String speziell aufsplitten nach Leerzeichen? Allgemeine Java-Themen 2
O String.format mit vorangestellten Leerzeichen Allgemeine Java-Themen 10
J Browser öffnen _mit leerzeichen in URL_ ? Allgemeine Java-Themen 3
A Leerzeichen entfernen Allgemeine Java-Themen 3
S String[] mit Leerzeichen Allgemeine Java-Themen 6
G Überprüfung auf Leerzeichen Allgemeine Java-Themen 6
J String rechtsbündig ausrichten / mit Leerzeichen auffüllen? Allgemeine Java-Themen 5
G Problem mit Leerzeichen im Pfad bei File und getResouce Allgemeine Java-Themen 2
MQue bei XML Leerzeichen unterdrücken Allgemeine Java-Themen 2
F Runtime.getRuntime().exec mit Linux und Leerzeichen Allgemeine Java-Themen 3
C Leerzeichen an String anfügen Allgemeine Java-Themen 4
S Java mag Leerzeichen nicht Allgemeine Java-Themen 3
P Leerzeichen im Pfad Allgemeine Java-Themen 8
G Leerzeichen entfernen unter 1.3.x Allgemeine Java-Themen 5
L LeerZeichen besser zu kontrollieren Allgemeine Java-Themen 3
A Pfad mit Leerzeichen über exec starten Allgemeine Java-Themen 6
C Leerzeichen rausfinden Allgemeine Java-Themen 6
N iText keine Sonderzeichen und Umlaute unter Windows Allgemeine Java-Themen 13
L Tess4j Umlaute anzeigen Allgemeine Java-Themen 3
T Umlaute in Eclipse einlesen funktioniert nicht Allgemeine Java-Themen 16
T Input/Output Konsole gibt trotz printf keine Umlaute aus Allgemeine Java-Themen 17
T Umlaute werden falsch gedruckt Allgemeine Java-Themen 2
F CaesarVerschlüsselung Umlaute Allgemeine Java-Themen 7
F Windows Umlaute Allgemeine Java-Themen 15
M Umlaute beim Einlesen von Dateinamen Allgemeine Java-Themen 12
C Regex (Case insensitive und Umlaute) Allgemeine Java-Themen 4
B Zip umlaute Allgemeine Java-Themen 8
S jar-Datei stellt Umlaute nicht dar Allgemeine Java-Themen 6
K Javamail:Probleme mit der Darstellung von Umlaute in Subject Allgemeine Java-Themen 15
S Umlaute machen probleme Allgemeine Java-Themen 3
E HTML File mit Umlaute einlesen Allgemeine Java-Themen 8
R Base64_decode Umlaute Problem. Allgemeine Java-Themen 8
J Umlaute bei Commons-Fileupload Allgemeine Java-Themen 3
T Wie konvertiere ich Umlaute (ä -> ae) ? Allgemeine Java-Themen 7
J Umlaute in regulären Ausdrücken Allgemeine Java-Themen 3
kodela replace und die Umlaute Allgemeine Java-Themen 10
D zeichenerkennung für umlaute bei eingabe Allgemeine Java-Themen 4
S Mac OS JRE verhunst Umlaute Allgemeine Java-Themen 6
G Datei einlesen: Umlaute sind Fragezeichen Allgemeine Java-Themen 23
cover1012 Umlaute in id3 Tags Allgemeine Java-Themen 2
F Umlaute: E-Mail per JavaMail und Textfile Allgemeine Java-Themen 5
J JAR und Umlaute Allgemeine Java-Themen 4
B Umlaute über Konsoloe ein- und ausgeben Allgemeine Java-Themen 5
G Windows Shell Umlaute Problem Allgemeine Java-Themen 19
E Umlaute: FileWriter vs. FileOutputStream Allgemeine Java-Themen 3
W Umlaute in Dateien und Verzeichnissen. Bekomme Fehler Allgemeine Java-Themen 5
M Umlaute richtig dastellen? Allgemeine Java-Themen 4
X Umlaute im JAR-File Allgemeine Java-Themen 4
B Umlaute-Problem bei Plattform-Wechsel Allgemeine Java-Themen 9
C Umlaute mysql Allgemeine Java-Themen 3
F Umlaute in Text . Allgemeine Java-Themen 7
V Umlaute, sonderzeichen beim HTMLEditiorKit Allgemeine Java-Themen 2
O Probleme mit Umlaute Allgemeine Java-Themen 12
B html umlaute decoden Allgemeine Java-Themen 4
G Datei aus Ordner wählen, ohne den Dateinamen im Pfad angeben zu müssen Allgemeine Java-Themen 4
N relativier Pfad für sqlite-Datenbank in Gradle/IntelliJ Allgemeine Java-Themen 2
S Pfad zu Ressourcen Allgemeine Java-Themen 17
T Probleme mit dem Pfad zum Propertie file Allgemeine Java-Themen 7
C FileOutputStream konkreter Pfad Allgemeine Java-Themen 3
L Classpath Relativer Pfad einer Resource? Allgemeine Java-Themen 9
sandaime CMD aufrufen und aktuellen pfad ändern Allgemeine Java-Themen 11
J .exe Dateien werden nicht gestartet obwohl Pfad richtig Allgemeine Java-Themen 6
C pfad vom Image ausgeben lassen Allgemeine Java-Themen 5
O log4j pfad per umgebungsvariable setzen Allgemeine Java-Themen 5
K Classpath Falscher Pfad? o.O Allgemeine Java-Themen 2
S Shell Commands mit absolutem Pfad ausführen Allgemeine Java-Themen 2
F LWJGL in keinem Java libary Pfad? Allgemeine Java-Themen 2
M FileInputStream relativer Pfad in .jar Allgemeine Java-Themen 2
D pfad zur jre linux Allgemeine Java-Themen 8
C Kompletter Pfad aus "input type=file" auslesen Allgemeine Java-Themen 3
C JAR, Pfad und Properties Allgemeine Java-Themen 17
P Pfad zu Dateien von "Tragbaren Gerät" Allgemeine Java-Themen 3
F Pfad der laufenden JAR ermitteln (mit Archivnamen) Allgemeine Java-Themen 2
U DLLs werden nicht gefunden trotz Pfad: Allgemeine Java-Themen 4
G log4j File erzeugen und Pfad bestimmen Allgemeine Java-Themen 3
A File Java Pfad Allgemeine Java-Themen 5
D JavaEE-WebApp Pfad auslesen Allgemeine Java-Themen 3
M Pfad in int[][] finden Allgemeine Java-Themen 4
J Java Pfad nicht mehr in Path Variablen??? Allgemeine Java-Themen 2
C Environment Variable in Pfad -> Datei öffnen Allgemeine Java-Themen 5
M Relativer Pfad oder Dateien in Jar Allgemeine Java-Themen 7
D Pfad aus Ressource-Datei auslesen Allgemeine Java-Themen 7
S FileInputStream aplication Pfad Allgemeine Java-Themen 4

Ähnliche Java Themen


Oben