Java getRuntime.exec();致命错误:没有这样的文件或目录";在错误流中(无异常)

Java getRuntime.exec();致命错误:没有这样的文件或目录";在错误流中(无异常),java,r,runtime.exec,Java,R,Runtime.exec,当我尝试使用下面的代码中的getRuntime().exec执行Java(rJava)中的R脚本时,进程的错误流抛出错误消息“致命错误:无法打开文件PID\u controller3.R:没有这样的文件或目录”。没有引发异常-当我尝试通过shell在同一目录中使用Rscript执行脚本时,一切正常。有人知道这里会出什么问题吗 例如,当我将java代码中的脚本路径更改为不存在的路径时,会引发IOException。在使用正确的路径时不会发生这种情况,但我得到了这个错误消息,它包含在进程的错误流中

当我尝试使用下面的代码中的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
,以说明包含空格字符的路径之类的情况。