java - Scala - 在特定场景下无法通过终端执行进程

标签 java scala exec graphviz dot

我正在使用 graphviz 根据在 scala 程序中传递的消息生成图表。 为了从 scala 程序内部调用 graphviz 应用程序,我使用了 exec() 方法(类似于 Java)。当我使用以下代码片段时,它成功执行了命令并创建了图形:

var cmd: String = "dot -Tpng Graph.dot -o Graph.png"  
var run: Runtime = Runtime.getRuntime() ;
var pr: Process = run.exec(cmd) ;

但是在更改输入和输出文件的路径后它无法执行(我只是包含了一个目录,输入文件和输出文件所在的目录如下所示)

  def main(args: Array[String]): Unit = {

   var DirectoryName: String = "Logs"

   var GraphFileName: String = DirectoryName + File.separator + "Graph.dot"      
   val GraphFileObj: File = new File(GraphFileName)

   // var cmd: String = "dot -Tpng Graph.dot -o Graph.png" 
   var cmd: String = "dot -Tpng \"" + GraphFileObj.getAbsolutePath + "\" -o \"" + DirectoryName + File.separator + "Graph.png\"" ;
   println(cmd)

   var run: Runtime = Runtime.getRuntime() ;
   var pr: Process = run.exec(cmd) ;

  }

通过终端执行相同的命令会给出正确的输出。你能帮我找到我丢失的东西吗?

最佳答案

exec 不是 shell...例如引用不会像您期望的那样工作,因此您的路径(可能包含空格等)将不会像您期望的那样被处理。该命令将使用 StringTokenizer 分解,您的文字引号将是......好吧......文字。

改用采用数组的 exec 形式,这样您就可以正确标记命令。

val args = Array[String]("dot", "-Tpng", GraphFileObj.getAbsolutePath, ...);
run.exec(args)

关于java - Scala - 在特定场景下无法通过终端执行进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13815404/

相关文章:

java - 如何正确生成唯一的 id 并将其存储在 ConcurrentHashMap 中

java - 为什么我的 for 循环告诉我语法错误,插入 "AssignmentOperator Expression"?

postgresql - 在 slick, scala 中处理 Postgres json 数据类型

scala - 旋转 View 引擎外观相似

php - PHP上的FFMPEG无法打开文件

java - 由于 C++ 与 Java 不同,文件操作如何在 C++ 中工作?

java - 增加 ActionListener 内的值的问题

java - 对集合成员使用带有辅助注入(inject)的 Guice 多重绑定(bind)

c - 在 UNIX 中使用 execve() 编写 ls 程序

javascript - NodeJS 脚本 - npm 在 exec() 上不显示当前安装的版本