UNIX Pipes in Java verwenden

wpb

Erfahrenes Mitglied
Hallo!

Wie würdet ihr diesen Problem angehe?
Hab mir zwar schon was überlegt, aber vielleicht gibst ja bessere Lösungswege...
Ich möchte diese Befehl" aus einem Java Programm aufrufen:

pngtopnm /home/mono/Bildbearbeitung/Bild1.png | ppmtojpeg > home/mono/Bildbearbeitung/Bildneu.jpeg

Alos pngtopnm und ppmtojpeg sind die zwei Programme die ich zur verwenden will.
Normalerweise kann man extern aufrufe ja mit Processbuilder realisieren.
Aber das geht ja in dem Fall nicht wegen den Pipes (> und |).

Ok, dann bin ich schon mal auf interessante Lösungsvorschläge gespannt...
 
Die Pipes sind ein Feature der Bash. Der ProcessBuilder startet aber keine Bash, daher gehts so nicht.

Ein Ausweg (ungetestet):

Packe Deinen Aufruf in ein shellscript:
Code:
#!/bin/bash
pngtopnm /home/mono/Bildbearbeitung/Bild1.png | ppmtojpeg > home/mono/Bildbearbeitung/Bildneu.jpeg
Wobei hier sicherlich noch die Dateinamen durch Platzhalter zu ersetzen sind ($0,$1).
Das Script rufst Du dann per ProcessBuilder auf.

Beachte, das Du die Ausgaben des Scripts entweder auslesen mußt (sonst hängt das ganze) oder im shell-script auf /dev/null (oder einen logdatei) umleitest. Siehe hierzu auch [1] http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=1

Gruß
 
Genau so hab ich es probiert.
Das mit dem "Umleiten" hab ich nicht gewusst.
Und es hat alles so richtig gehängt...
 
Ja, umleiten der Ausgabe erfolgt mit dem > Zeichen.
per
Code:
/usr/bin/irgendeinprogramm >> out.log 2>&1
kannst Du die Standard Ausgabe (die 1) und die Fehlerausgabe (2) in die Datei out.log umleiten. Wenn Du die Ausgaben dann nicht mehr sehen willst (nach dem Debuging) kannst Du ja statt out.log /dev/null hinschreiben.

Gruß
 
Also zum Testen hab ich es jetzt mal so gemacht:

Skript:
Code:
#!/bin/sh

pngtopnm $1 | ppmtojpeg  > /home/mono/Bildbearbeitung/Bildfertig.jpg

und der Java Code:
Code:
      ProcessBuilder builder = new ProcessBuilder("/home/Scrpits/png2jpg.sh", 
									"/home/mono/Bildbearbeiung/Bild1.png");
		System.out.println(builder.command());
		builder.directory(new File ("/tmp")); //[/home/Scrpits/png2jpg.sh, 								/home/mono/Bildbearbeiung/Bild1.png]
		Process p = builder.start();
		//Scanner s = new Scanner( p.getInputStream() ).useDelimiter( "\\Z" ); 
	   	//System.out.println( s.next() );

Wenn ich das Java Prog starte, dann wird zwar eine Datei angelegt (Bildfertig.jpg), ist aber 0KB "groß".
Wie kann das sein.
 
Wie schon geschrieben, Du hast 2 Möglichkeiten. Entweder dafür sorgen, das der von Java erzeugte Process nichts auf Standart-Out und Error-Out schreibt (dies geht z.b. mit der von mir oben beschriebenen Ausgabeumlenkung in dem .sh).
Oder aber, Du ließt die beiden Streams vom Java aus. Dazu reicht es aber nicht, die Streams einfach zu öffnen, Du mußt dort auch was auslesen. In dem Link von mir weiter oben (der zu dem javaWorld Artikel, wird das im Detail beschrieben. Auch Code zur Implementierung ist dort zu finden.

Gruß
 
Hab ich ja auch schon versucht:

Code:
#!/bin/sh

pngtopnm $1 |
pnmtojpeg  > /home/mono/Bildbearbeitung/Bildfertig.jpg >> /dev/null

Klappt aber immer noch nicht...
 
Zurück