0
ProcessBuilder pb = new ProcessBuilder(commandInformation);
Process process = pb.start();

上面的代码返回错误:

java.lang.IllegalArgumentException
    at java.lang.ProcessImpl.<init>(ProcessImpl.java:69)
    at java.lang.ProcessImpl.start(ProcessImpl.java:30)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:452)
    at com.ConvertsImages.SystemCommandExecutor.executeCommand(SystemCommandExecutor.java:51)
    at com.ConvertsImages.ImageConversion.runConvertCommand(ImageConversion.java:115)
    at com.ConvertsImages.ImageConversion.runConvert(ImageConversion.java:80)
    at com.ConvertsImages.ImageConversion.main(ImageConversion.java:26)

List commandInformation只有一个条目,如下所示:

["D:\Program Files\ImageMagick-6.8.6-Q16\convert.exe"  "D:\ConvertFiles\ReImport_2507_1.jpg"  -resize 40x40 "D:\ConvertFiles\proxy-40\ReImport_2507_1.jpg.jpg" ]

请建议。

4

3 回答 3

5

查看 的源代码ProcessBuilder,有一个方法isQuoted检查是否引用了 String 参数,IllegalArgumentException如果是则抛出并检查标志。

private static boolean isQuoted(boolean noQuotesInside, String arg,
        String errorMessage) {
    int lastPos = arg.length() - 1;
    if (lastPos >=1 && arg.charAt(0) == '"' && arg.charAt(lastPos) == '"') {
        // The argument has already been quoted.
        if (noQuotesInside) {
            if (arg.indexOf('"', 1) != lastPos) {
                // There is ["] inside.
                throw new IllegalArgumentException(errorMessage);
            }
        }
        return true;
    }
    if (noQuotesInside) {
        if (arg.indexOf('"') >= 0) {
            // There is ["] inside.
            throw new IllegalArgumentException(errorMessage);
        }
    }
    return false;
}

上面调用 from getExecutablePath,注意true标志

 boolean pathIsQuoted = isQuoted(true, path,
            "Executable name has embedded quote, split the arguments");

ProcessImpl在构造函数内部调用

String executablePath = getExecutablePath(cmd[0]);

cmd从您的列表中创建的数组在哪里。索引 0 匹配可执行文件(在您的情况下是整个字符串)。在您向我们展示的字符串中,您的可执行文件被引用(或至少以一个开头),因此该方法将抛出一个IllegalArgumentException.

您的堆栈跟踪证实了这一点

at java.lang.ProcessImpl.<init>(ProcessImpl.java:69)

这意味着在您的构造函数内部。

将命令列表中的每个参数拆分为列表中的单独字符串元素。不要在可执行文件周围加上引号。

于 2013-08-14T13:43:20.020 回答
0

我怀疑你需要一个'n'参数列表。

它目前正在将您的第一个列表条目解释为可执行文件,这显然是不正确的,因为它也包含了您的参数。

于 2013-08-14T13:33:14.513 回答
0

请确保在 ProcessBuilder 中传递的参数,commandInformation is a String array or a List<String>.

参数:command 包含程序及其参数的字符串数组

Parameters:
command The list containing the program and its arguments

资源

甲骨文文档。这说明了 IllegalArgumetnException 的原因之一。

此外,我刚刚注意到您拥有的文件名包含在.jpg.jpg. 难道不应该fileName.jpg

于 2013-08-14T13:49:03.103 回答