• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

Java: Prozess startet im Terminal, über Runtime.exec(..) aber nicht?!

MikeZ

Freiherr von Berlepsch
Registriert
19.01.05
Beiträge
1.116
Hallo,
ich möchte aus meinem Java-Programm eine PDF in eine PNG-Datei konvertieren. Wenn ich folgendes in Kommandozeile gebe, klappt es:

/opt/local/bin/gm convert -trim -density 100 /Users/blah/temp.pdf /Users/blah/temp.png

Den Aufruf des Programms habe ich so gemacht: (auf die relevanten Sachen gekürzt):

Code:
String[] pngCall = {pngExe.toString(), "convert", "-trim", "-density "+dpi, pdfInput.getAbsolutePath(),
                                pngOutput.getAbsolutePath()};

            for (String str:pngCall) {
                System.out.print(a+" ");
            }

            Process proc = null;
            try {
                proc = Runtime.getRuntime().exec(pngCall, null, tempDir);
            } catch (Throwable t) {
                //...
            }
            
            try {
                System.out.println(proc.waitFor());

                java.io.InputStream is = proc.getInputStream();
                java.io.InputStreamReader isr = new java.io.InputStreamReader(is);
                java.io.BufferedReader br = new java.io.BufferedReader(isr);

                String str = "";

                while (null != (str = br.readLine())) {
                    System.out.println(str);
                }

                proc.destroy();
                br.close();
   //...

Das Programm gibt (bei der ersten For-Schleife) genau den gleichen Code aus, den ich auch in die Kommandozeile eingeben würde und der dort funktioniert, trotzdem klappt es nicht... Das Programm gibt den Exit Code 1 aus und macht nichts, soweit ich das beurteilen kann.

Hat mir einer einen Rat? Bin am verzweifeln...
Grüße,
Michael
 

AgentSmith

Hochzeitsapfel
Registriert
15.07.07
Beiträge
9.304
Das Problem hatte ich auch mal. Da es nichts kritisches war und ich keinen Nerv hatte, mehr als fünf Minuten rumzuprobieren, habe ich damals einfach ein Shell-Skript mit dem Befehl schreiben lassen und das aufgerufen. Dirty Workaround, hat aber geklappt. Eine echte Lösung würde mich aber auch durchaus interessieren.
 

MikeZ

Freiherr von Berlepsch
Registriert
19.01.05
Beiträge
1.116
Das wäre eine Idee, aber wenn ich "schöner" hinkriegen könnte wär's ... schöner ;)

Es ist echt komisch... Das hier...
Code:
String[] pngCall = {pngExe.toString(), "convert", "-list", "format"};
proc = Runtime.getRuntime().exec(pngCall);

...klappt perfekt, das hier:

Code:
String[] pngCall = {pngExe.toString(), "convert", input, output};
proc = Runtime.getRuntime().exec(pngCall);

...nicht... Ich bin ratlos :(

Wie gesagt, wenn ich mir den Befehl in der Konsole ausgebe und in die Kommandozeile paste, klappt es.
 

MACRASSI

Gelbe Schleswiger Reinette
Registriert
21.11.04
Beiträge
1.754
Ich brauch eure Hilfe.
Ich hock jetzt stundenlang vor Google und find einfach nix.

Ich will einen bestimmten Befehl in einem Verzeichnis ausführen.

Code:
		String [] b = {"git log --graph --all"};
		String [] c = {};
		File f =  new File("/Users/bla/Documents/ein\\ ordner/");
		
		Process s = Runtime.getRuntime().exec(b, c, f);
		BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
		String line = br.readLine();
		while(line != null){
			System.out.println(line);
			line = br.readLine();
		}
		s.getInputStream().close();

Also, er soll den Befehl in einem Ordner ausführen, der aber ein Leerzeichen hat.
Es klappt einfach nicht. ich bekomme immer Directory not found.

Was soll ich machen?

Gruß Rasmus