ProcessBuilder vs Runtime.exec ()

Estoy tratando de crear una aplicación frontend en Java para manejar las conversiones SVG por lotes usando la función de línea de comando de Inkscape. Estoy tomando y actualizando el código dehttps://sourceforge.net/projects/conversionsvg/. La forma en que el desarrollador original manejó llamando a Inkscape porRuntime.getRuntime (). Exec (String). El problema con el que me encuentro es que hay algunas inconsistencias entre el uso del método A y el método B. Creé un proyecto de prueba de Java simple para demostrar las diferentes acciones que se realizan.

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();
    }
}

Resultado

AmbosmétodoA (cadena) llama al trabajo, pero cuandométodoB (Cadena []) se llama Inkscape se está iniciando y los argumentos se pasan incorrectamente. DespuésmétodoB (Cadena []) ejecuta Me sale un cuadro de diálogo de error de Inkscape por cada dicho

Error al cargar el archivo solicitado -f C: /test.svg -D -w 100 -h 100 -e C: \ RuntimeExec-methodB.png

Error al cargar el archivo solicitado -f C: /test.svg -D -w 100 -h 100 -e C: \ ProcessBuilder-methodB.png

y cuando hago clic en Cerrar en el cuadro de diálogo, Inkscape aparece con un nuevo documento en blanco. Entonces, supongo que tengo algunas preguntas:

¿Cuál es la diferencia entre Runtime.getRuntime (). Exec (String) y Runtime.getRuntime (). Exec (String [])?

JavaDoc dice queRuntime.exec (String) llamadasRuntime.exec (comando, nulo) (cual esRuntime.exec (Strd cmd, String [] envp)) que a su vez llamaRuntime.exec (cmdarray, envp) (cual esRuntime.exec (String [] cmdarray, String [] envp)) Así que siRuntime.getRuntime (). Exec (String) esta llamandoRuntime.exec (Cadena []) de todos modos, ¿por qué obtengo resultados diferentes cuando uso diferentes métodos?

¿Está sucediendo algo detrás de escena donde Java configura el entorno de manera diferente según el método que se llame?

Respuestas a la pregunta(1)

Su respuesta a la pregunta