Как использовать Java для запуска исполняемого файла portace для создания файла SVG из растрового файла - PullRequest
2 голосов
/ 24 сентября 2019

Я посмотрел, как запустить исполняемый файл в Java с помощью компоновщика процессов Runtime, но он не работает.Мой код выглядит следующим образом ...

        String command = "potrace --svg mb-finer-19.pbm -o mb-finer-19.svg";
        try {
            File f = new File("C:\\webstudio\\potrace113win32");
            Process process = Runtime.getRuntime().exec(command, null, f);
            System.out.println("the output stream is " + process.getOutputStream());
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String s;
            while ((s = reader.readLine()) != null) {
                System.out.println("The inout stream is " + s);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

, но я получаю обратно

java.io.IOException: Cannot run program "potrace" (in directory "C:\webstudio\potrace113win32"): CreateProcess error=2, The system cannot find the file specified
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
    at java.lang.Runtime.exec(Runtime.java:620)
    at java.lang.Runtime.exec(Runtime.java:450)
    at shellcommands.RunPotrace.main(RunPotrace.java:22)
Caused by: java.io.IOException: CreateProcess error=2, The system cannot find the file specified
    at java.lang.ProcessImpl.create(Native Method)
    at java.lang.ProcessImpl.<init>(ProcessImpl.java:386)
    at java.lang.ProcessImpl.start(ProcessImpl.java:137)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)```

Где я ошибаюсь с этим, как это в соответствии с Javadocs?Исполняемый файл portace.exe находится в каталоге вместе с образом mb-finer-19.pbm. Помощь будет очень полезна.

Ответы [ 2 ]

1 голос
/ 24 сентября 2019

Я запустил следующее, и это сработало ...

String command = "C:\\webstudio\\potrace113win32\\potrace.exe --svg mb-finer-19.pbm -o mb-finer-19.svg";

Очевидно, должен быть указан весь путь, если он не находится в системном пути.Извиняюсь за то, что не попробовал это, прежде чем задавать вопрос.

0 голосов
/ 24 сентября 2019

Вот правильный способ запустить такой процесс:

    Path imagesDir = Paths.get(
        System.getProperty("user.home"), "Documents");

    Path inputFile = imagesDir.resolve("mb-finer-19.pbm");
    Path outputFile = imagesDir.resolve("mb-finer-19.svg");

    ProcessBuilder builder = new ProcessBuilder(
        "C:\\webstudio\\potrace113win32\\potrace.exe",
        "--svg",
        inputFile.toString(),
        "-o",
        outputFile.toString());

    builder.inheritIO();

    Process process = builder.start();
    int exitCode = process.waitFor();
    if (exitCode != 0) {
        throw new IOException("Got error code " + exitCode
            + " from command " + builder.command());
    }

inheritIO () приведет к тому, что весь вывод дочернего процесса появится в выводе программы Java, котораявызывает его, избавляя от необходимости самим использовать InputStream и ErrorStream процесса.

Одно важное преимущество использования отдельных аргументов командной строки вместо одной командной строки заключается в том, что имена файлов с пробелами в них будут обрабатываться правильно.Это делает ваш код более переносимым, так как он будет работать с любым допустимым файлом и любым допустимым каталогом.

...