Java getRuntime.exec();致命错误:没有这样的文件或目录";在错误流中(无异常)
当我尝试使用下面的代码中的getRuntime().exec执行Java(rJava)中的R脚本时,进程的错误流抛出错误消息“致命错误:无法打开文件PID\u controller3.R:没有这样的文件或目录”。没有引发异常-当我尝试通过shell在同一目录中使用Rscript执行脚本时,一切正常。有人知道这里会出什么问题吗 例如,当我将java代码中的脚本路径更改为不存在的路径时,会引发IOException。在使用正确的路径时不会发生这种情况,但我得到了这个错误消息,它包含在进程的错误流中Java getRuntime.exec();致命错误:没有这样的文件或目录";在错误流中(无异常),java,r,runtime.exec,Java,R,Runtime.exec,当我尝试使用下面的代码中的getRuntime().exec执行Java(rJava)中的R脚本时,进程的错误流抛出错误消息“致命错误:无法打开文件PID\u controller3.R:没有这样的文件或目录”。没有引发异常-当我尝试通过shell在同一目录中使用Rscript执行脚本时,一切正常。有人知道这里会出什么问题吗 例如,当我将java代码中的脚本路径更改为不存在的路径时,会引发IOException。在使用正确的路径时不会发生这种情况,但我得到了这个错误消息,它包含在进程的错误流中
try {
Process p = Runtime.getRuntime().exec("C:\\Program Files\\R\\R-3.3.0\\bin\\Rscript " + "PID_controller3.R");
BufferedReader br = new BufferedReader(new InputStreamReader(p.getErrorStream()));
String line;
while((line = br.readLine()) != null)
System.out.println("Read error stream: \"" + line + "\"");
int code = p.waitFor();
switch (code) {
case 0:
//normal termination, everything is fine
Log.printLine(code);
break;
default:
Log.printLine(code);
}
}
catch (Exception ie){ System.out.println(ie.toString());}
从操作系统查看时,一个进程从另一个进程派生,并继承该进程的所有属性,除非另有说明。了解系统中的所有进程都是树的一部分。此规则的唯一例外是根进程,它也是树的根,甚至对操作系统也有特殊意义 在继承的属性中有工作目录。例如,在shell中,可以键入:
$ ls someFile
shell(其提示符在此处可见($
)具有给定的工作目录;命令(ls someFile
)将假定shell的工作目录中有一个名为someFile
的文件(因为为执行ls
命令而启动的进程继承了该文件)
在您的情况下,您希望处理的文件不在您创建的进程的当前工作目录中。Java的运行时
不允许您更改这一点
但是ProcessBuilder
可以:
final Path workingDir = Paths.get("path/to/working/dir");
final ProcessBuilder pb = new ProcessBuilder("path/to/command", "thefile")
.directory(workingDir.toFile());
// obtain a Process using pb.exec()
您是否尝试提供.R文件的绝对路径?或相对于用户目录的正确相对路径。首先:您不应使用
运行时
执行命令。请改用ProcessBuilder
。有关正确创建和处理流程的许多好提示,请参见。然后忽略它引用exec
,并使用ProcessBuilder
创建流程。还可以将字符串arg
分解为字符串[]args
,以说明包含空格字符的路径之类的情况。