ProcessBuilder vs Runtime.exec ()

Ich versuche, eine Frontend-App in Java zu erstellen, um Stapel-SVG-Konvertierungen mithilfe der Befehlszeilenfunktion von Inkscape durchzuführen. Ich nehme und aktualisiere den Code vonhttps: //sourceforge.net/projects/conversionsvg. Wie der ursprüngliche Entwickler Inkscape von @ aufgerufen h Runtime.getRuntime (). Exec (String). Das Problem, auf das ich stoße, sind einige Inkonsistenzen zwischen der Verwendung von MethodeA und MethodeB. Ich habe ein einfaches Java-Testprojekt erstellt, um die verschiedenen ausgeführten Aktionen zu demonstrieren.

CallerTest.java

package conversion;

import java.io.IOException;

public class CallerTest {

    static String pathToInkscape = "\"C:\\Program Files\\Inkscape\\inkscape.exe\"";  

    public static void main(String[] args) {

      ProcessBuilderCaller processBuilder = new ProcessBuilderCaller();
      RuntimeExecCaller runtimeExec = new RuntimeExecCaller();

      // methodA() uses one long command line string
      try {

        String oneLongString_ProcessBuilder = pathToInkscape + " -f \"C:\\test.svg\" -D -w 100 -h 100 -e \"C:\\ProcessBuilder-methodB.png\"";
        String oneLongString_RuntimeExec =    pathToInkscape + " -f \"C:\\test.svg\" -D -w 100 -h 100 -e \"C:\\RuntimeExec-methodA.png\"";

//        processBuilder.methodA(oneLongString_ProcessBuilder);
        runtimeExec.methodA(oneLongString_RuntimeExec);

      } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }

      // methodB() uses an array containing the command and the options to pass to the command
      try {

        String[] commandAndOptions_ProcessBuilder = {pathToInkscape, " -f \"C:/test.svg\" -D -w 100 -h 100 -e \"C:\\ProcessBuilder-methodB.png\""};
        String[] commandAndOptions_RuntimeExec =    {pathToInkscape, " -f \"C:/test.svg\" -D -w 100 -h 100 -e \"C:\\RuntimeExec-methodB.png\""};

        processBuilder.methodB(commandAndOptions_ProcessBuilder);
//        runtimeExec.methodB(commandAndOptions_RuntimeExec);

      } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
}

RuntimeExecCaller.java

package conversion;

import java.io.IOException;

public class RuntimeExecCaller {
    Process process;

    // use one string
    public void methodA(String oneLongString) throws IOException {
      process = Runtime.getRuntime().exec(oneLongString);
    }

   , // use the array
    public void methodB(String[] commandAndOptions) throws IOException {
      process = Runtime.getRuntime().exec(commandAndOptions);
    }
}

ProcessBuilderCaller.java

package conversion;

import java.io.IOException;

public class ProcessBuilderCaller {
    Process process;

    // use one string
    public void methodA(String oneLongString) throws IOException {
      process = new ProcessBuilder(oneLongString).start();
    }

    // use the array
    public void methodB(String[] commandAndOptions) throws IOException {
      process = new ProcessBuilder(commandAndOptions).start();
    }
}

Ergebni

BeidemethodA (String) Anrufe funktionieren, aber wennmethodB (String []) heißt Inkscape wird gestartet und die Argumente werden falsch übergeben. NachmethodB (String []) wird ausgeführt Ich erhalte einen Inkscape-Fehlerdialog für jedes Sprichwort

Die angeforderte Datei konnte nicht geladen werden -f C: /test.svg -D -w 100 -h 100 -e C: \ RuntimeExec-methodB.png

Die angeforderte Datei konnte nicht geladen werden -f C: /test.svg -D -w 100 -h 100 -e C: \ ProcessBuilder-methodB.png

und wenn ich im Dialogfeld auf Schließen klicke, wird Inkscape mit einem neuen leeren Dokument angezeigt. Also, ich schätze, ich habe ein paar Fragen:

Was ist der Unterschied zwischen Runtime.getRuntime (). Exec (String) und Runtime.getRuntime (). Exec (String [])?

JavaDoc sagt, dass Runtime.exec (String) Anrufe Runtime.exec (Befehl, null) (welches ist Runtime.exec (String cmd, String [] envp)) was wiederum @ aufru Runtime.exec (cmdarray, envp) (welches ist Runtime.exec (String [] cmdarray, String [] envp)). Also, wenn Runtime.getRuntime (). Exec (String) ruft an Runtime.exec (String []) Wie auch immer, warum erhalte ich unterschiedliche Ergebnisse, wenn ich unterschiedliche Methoden verwende?

Passiert hinter den Kulissen etwas, bei dem Java die Umgebung abhängig von der aufgerufenen Methode unterschiedlich einrichtet?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage