使用 ProcessBuilder 并将参数列表作为单个字符串

Rap*_*oth 5 java processbuilder

我尝试从 Java 程序切换Runtime.exec(command)ProcessBuilder执行 ImageMagick 。convert转换的选项是从用户作为字符串传入的,因此我无法轻松地分离参数以将它们单独传递给 的ProcessBuilder构造函数。在(Unix)命令行上运行的实际命令是

convert -colorspace gray -enhance -density 300 in.pdf out.pdf
Run Code Online (Sandbox Code Playgroud)

我怎样才能让它工作:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

目前,代码只是运行

Som*_*ude 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();
}
Run Code Online (Sandbox Code Playgroud)