我尝试从Runtime.exec(command)
切换到ProcessBuilder
,以便从Java程序执行ImageMagick的convert
。转换的选项是作为String从用户传入的,所以我不能轻易地将参数分开以将它们单独传递给ProcessBuilder
的构造函数。适用于(Unix)命令行的实际命令是
convert -colorspace gray -enhance -density 300 in.pdf out.pdf
如何才能实现这一目标:
public class Demo {
public static void main(String[] args) throws IOException, InterruptedException {
String convertOptions = "-colorspace gray -enhance -density 300"; // arguments passed in at runtime
ProcessBuilder bp = new ProcessBuilder(new String []{"convert",convertOptions,"in.pdf","out.pdf"});
Process process = bp.start();
process.waitFor();
}
}
目前,代码只是运行
答案 0 :(得分:2)
老问题,但因为我面临类似的情况......
如果您不想将命令字符串拆分为数组,则可以使用bash -c
执行整个字符串:
String convert= "convert -colorspace gray -enhance -density 300";
String[] cmd= new String[] {"bash", "-c", convert};
ProcessBuilder builder = new ProcessBuilder(cmd);
...
这当然假定bash
可用。
答案 1 :(得分:0)
您可以使用正则表达式获取您的参数,如下面的代码所示:
String regex = "((\\s*|-)\\w+)";
Pattern p = Pattern.compile(regex);
String convertOptions = "-colorspace gray -enhance -density 300"; // //arguments passed in at runtime
Matcher matcher = p.matcher(convertOptions);
List<String> pargs = new ArrayList<String>();
pargs.add("convert");
while(matcher.find())
{
String match = matcher.group();
if( match != null )
{
pargs.add(match.trim());
}
}
pargs.add("in.pdf");
pargs.add("out.pdf");
try
{
ProcessBuilder bp = new ProcessBuilder( pargs.toArray(new String[]{}) );
Process process = bp.start();
process.waitFor();
}
catch(Exception ex)
{
ex.printStackTrace();
}