PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java: exec->String tokenizer, wie verhindern?



peschmae
16-09-2002, 10:47
hallo,

ich hab (wieder mal) n Java - Problem (wieder mal) mit
Runtime.getRuntime().exec() ...

ich möchte damit mkisofs/mkhybrid folgendermassen aufrufen

mkisofs -preparer "hallo ich hab das teil erstellt"

(den Rest hab ich weggelassen, da dies das Kernproblem ist, die
Anführungszeichen kriege ich problemlos in den String, da ich diese aus
ner Datei lese)

Runtime.getRuntime().exec()

muss aber blöderweise nen String Tokenizer darüber laufen lassen und
den interessieren die schönen " einen feuchten ...,
was dann ein Aufruf in der Art von "mkisofs -preparer ich hab das teil"
zur Folge hat, bei der mkisofs (zu recht) die Ordner/Dateien hab, das
und teil vermisst ...

weiss jemand wie String Tokenizer dazu bringe mir den Teil zwischen den ""
und auch die "" damit, in Ruhe zulassen?

MfG Peschmä

anda_skoa
16-09-2002, 11:08
Nimm eine andere Runtime.exec Methode.

Ich denke, dass zB Runtime.exec(String[]) keinen Tokenizer braucht, weil es den String ja nicht in executable+argumente zerlegen muß.

Ciao,
_

peschmae
16-09-2002, 11:14
also:

Runtime.getRuntime().exec(new String[] {"mkisofs", "-preparer knusper und so"});

ich probiers mal aus! (Hätte auch selbst drauf kommen sollen!:mad: )

MfG Peschmä

anda_skoa
16-09-2002, 11:31
Eventuell mußt du das -preparer in ein eigenes Argument packen.

Wenn Java um jedes Argument "" herumsetzt, würde es "-preparer knsuper und so" als ein Argument an die Applikation weiterreichen, die das dann womöglich nicht parsen kann.

Ciao,
_

peschmae
17-09-2002, 07:36
hab gestern n bisserl herumgespielt

(ein testprogramm mit ls -s -R /home/peschmae)

jetzt muss ich halt alles selbst tokenizern (ausser dem "I'm the (super) preparer")

MfG Peschmä

peschmae
17-09-2002, 10:33
nach dem was ich bis jetzt herausgefunden habe,

muss man die argumente jeweils als array - teil eingeben, also

a[0] = "-preparer"
a[1] = "knusper knusper2 knusper3"

allerdings hatte ich nicht genug zeit, das genau korrekt auszuprobieren (musste noch n bisserl Mathe lernen)

MfG Peschmä

anda_skoa
17-09-2002, 11:12
Ich entnehme deinem Posting, dass es mit dem anderen exec Aufruf klappt.

Kannst du kurz noch schreiben, ob man die Parameter jeweils in eigene Strings packen muß?
Also ob man "-preparer was weiss ich" als einen String oder als zwei übergeben muß.

Würde mich interessieren :)

Ciao,
_

peschmae
18-09-2002, 12:18
-preparer als arrayteil
und der "was weiss ich" als arrayteil, geht

aber wass wenn ich pipen will!?

mkisofs | cdrecord -

um kurz zu sein ...

muss ich das alles selber vom stdin lesen und in den stdout schreiben (eigener thread und zwei bufferedreader/writer)? Mir fällt derzeit keine Alternative ein

MfG Peschmä

anda_skoa
18-09-2002, 12:34
Hmm, man könnte versuchen, alles in ein script zu packen und das zu executen.

Ciao,
_

peschmae
19-09-2002, 08:30
die idee hatte ich auch schon...

aber es soll plattformunabhängig werden

MfG Peschmä

anda_skoa
19-09-2002, 10:25
Hmm, aber mkisofs bzw,. cdrecord sind ja auch nicht unabhängig, oder?

Ansonsten könntest du probieren (falls du es nicht eh schon versucht hast) das Pipzeichen auch als einzelen Parameter zu übergeben.

Ciao,
_

peschmae
19-09-2002, 11:02
nicht ganz, aber zumindest ein bisschen, auf jeden fall laufen sie auch auf der W*** - Plattform (ok, ich könnte gleich auch noch ne bash mitliefern, für das Script, aber sowas finde _ich_ blöd)

das pipe als parameter geht leider auch net
(habs mit nem "ls -s -R ~ | grep Java") versucht, das | grep Java wird einfach ignoriert, d.h. der Output ist der von "ls -s -R ~"

MfG Peschmä

anda_skoa
19-09-2002, 12:00
Kannst du mal unter Linux probieren, ob es geht, wenn du das ganze Pipekommando als Parameter von sh -c ausführst?

Also
sh -c "ls -s -R ~ | grep Java"

Außerdem bräuchtest du für Windows nicht unbedingt eine Bash, ich denke es geht dort auc mit einer Batch Datei.

Ciao,
_

peschmae
19-09-2002, 12:05
sieh mal aufhttp://www.brennmeister.com/cdrfaq/3.html nach:

Jetzt wird es "ernst": Du möchtest das Ganze ohne Umweg "on-the-fly" direkt auf CD-R brennen? Kein Problem, allerdings sollte Dein System gut konfiguriert sein oder Du solltest SCSI-Komponenten haben. Es geht nicht, nein wirklich nicht über den normalen Command Prompt von Win9x oder WinNT/2000, weil die Pipes hier nicht standardkonform funktionieren.

habs nie selbst probiert

MfG Peschmä

anda_skoa
19-09-2002, 13:12
Dann hast du eh eine Shell zu Verfügung, oder versteh ich das falsch?



Auch das ist kein Problem, im cdrecord Verzeichnis findest Du sh.exe, welches Du einfach durch Eingabe von sh startest. Du siehst als "Prompt" erstmal nur ein Dollarzeichen, befindest Dich aber jetzt in einer standard-konformen Shell, welche das Pipen unterstützt.


Ciao,
_

peschmae
19-09-2002, 14:02
ja, schon

wenns nicht anders geht werd ich das so machen, aber eigentlich möchte ich die menge der abhängigkeiten (da sind derzeit schon cdrecord und mkisofs) möglichst klein halten und deshalb alles andere in java schreiben

MfG Peschmä

P.S. was ich programmiere: n ersatz für Barts Cdrpack (nettes Teil zum Erstellen von Multibootcds unter Windows, die Benutzeroberfläche läuft aber _nur_ unter Windows (wegen des verwendeten wbat)), geschrieben in Java/Swing

anda_skoa
19-09-2002, 16:39
Ganz OS unabhängig geht es nie, sobald man mit Hardware zu tun hat.

Am besten ist, man macht es in diesen Fällen so wie die Java Class Library.
D.h. man definiert eine abstrakte Klasse und lädt dann entsprechend dem OS eine bestimmte Implementation.

Das beste Beispiel ist da ja Process oder awt.Toolkit

Ciao,
_

peschmae
20-09-2002, 07:12
ok,
ich bin ja schon überzeugt...

aber wie soll ich das machen, von shell scripts hab ich keine ahnung

wie krieg ich das dazu am richtigen ort die argumente zu trennen, dh ein teil für mkisofs und ein teil für cdrecord, zahl unbekannt?

oder soll ich einfach aus dem java-programm mit einem writer selbst ein shellscript schreiben und dieses dann ausführen? Ich denke das ist die einfachste möglichkeit

MfG Peschmä