Runtime.getRuntime().exec " escapen?

Thallius

Top Contributor
Ich habe da ein komisches Verhalten der exec Funktion.

Ich habe eine .jar die erwartet einen Pfad als Parameter. Wenn ich die Datei so aufrufe

java -jar egal.jar "/egal/total egal/noch egaler/am egalsten.ega"

dann erhalte ich in der main Methode ein

args.length = 1 und
args[0]=/egal/total egal/noch egaler/am egalsten.ega (Man beachte die Anführungszeichen sind nicht Bestandteil des Argumentes, was ja auch richtig ist)

Rufe ich die jar aber mit

Runtime.getRuntime().exec("java -jar egal.jar \"/egal/total egal/noch egaler/am egalsten.ega\"")

auf, dann erhalte ich

args.length = 4 und
args[0]="/egal/total
args[1]=egal/noch
args[2]=egaler/am
args[3]=egalsten.ega

Was muss ich also machen um die " richtig zu escapen?

Gruß

Claus
 
Ja ich hatte auch erst überlegt mein Post wieder zu löschen als ich die Lösung direkt gefunden habe nachdem ich vorher immer nach den falschen Stichworten gegooglt habe. Aber vielleicht hilft es mal jemadem also lassen wir es stehen 🙂

Trotzdem Danke

Claus
 
Zuletzt bearbeitet:
warum nutzt du eigentlich keinen ProcessBuilder? 🙂

ProcessBuilder (Java Platform SE 7 )

EDIT: Kleiner Wink am Rande: Für das "starten und vergessen" einer externen Anwendung nutze ich meist noch ein
Code:
cmd /c start anwendung.exe irgendwelche_parameter
 
Zuletzt bearbeitet:
Hallo Claus,

ich gebe zu, deine Mac-Affinität habe ich nicht bedacht - trotzdem stellt sich für mich immer noch die Frage, was dich an einer Verwendung von ProcessBuilder hindert - dieser sollte, soweit ich mich entsinne, plattformunabhängig sein.

Viele Grüße
Sven
 
Zuletzt bearbeitet:
Hallo Claus,

ich gebe zu, deine Mac-Affinität habe ich nicht bedacht - trotzdem stellt sich für mich immer noch die Frage, was dich an einer Verwendung von ProcessBuilder hindert - dieser sollte, soweit ich mich entsinne, plattformunabhängig sein.

Viele Grüße
Sven

Meine Affinität ist hierbei leider sehr irrelevant. Der Kunde will das die App auf allen drei OS läuft. Deshalb mache ich sie ja überhaupt in Java. Sonst hätte ich direkt zu C/C++ gegriffen, was ich deutlich angenehmer finde 😉

Was für einen Vorteil bringt mir der ProcessBuilder denn? Wenn man es sich auf die schnelle ansieht, sieht es eigentlich genauso aus, ausser das man da direkt die PArameter angiebt und beim exec halt in einem String Array.

Gruß

Claus
 
Ich muss da doch mal ein wenig zurückrudern - das kommt davon, wenn man sich um Plattformunabhängigkeit keinen Kopf zu machen braucht.

Im Gegensatz zum ProcessBuilder ist das ausführen externer Programme mit exec() unabhängig(er) vom verwendeten System, auch wenn die Kontrollmöglichkeiten eingeschränkt sind - wieder was gelernt.

Grüße
Sven
 
Man beachte aber auch, dass .exec stdout und stderr in InputStreams puffert, und dafür wohl 64k Pufferspeicher vorhält. Wenn die voll sind, wird der Unterprozess angehalten, bis das Java-Programm die Puffer geleert hat - und sei's bis Sankt Nimmerlein.
D.h. man braucht einen nebenläufigen Thread, der sich die Streams von dem Prozess greift, den .exec zurückliefert, und der schön die Ausgaben pollt; und auch wieder schön beendet wird, wenn das Unterprogramm zu Ende ist.

PS: Zumindest unter Windoof/JVM von Oracle. Linux müsst' ich erst ausprobieren, für Mac-Zeug fehlt mir ein Zugang/Hardware...
 
Zuletzt bearbeitet:

Zurück
Oben