如何将文件的绝对(完整)路径传递给ProcessBuilder类

时间:2018-02-07 14:23:49

标签: java

我正在尝试运行流程构建器来执行我的java项目的 bin / resources / 文件夹中的文件。为此,我不想对完整路径进行硬编码,因此我尝试使用类加载器传递绝对路径(我的意思是完整路径)并将此值作为列表参数传递给ProcessBuilder类。我怎么也没能成功。

下面的代码示例(案例1和案例2)运行良好,但最终没有任何事情发生。我的意思是文件没有被调用。

案例1:

String rCmd = "Rscript.exe";
String rScriptName = "resources/MyScript.R";
List list = new ArrayList<>();
list.add(rCmd);
list.add(this.getClass().getClassLoader().getResource(rScriptName).toURI().toString());
ProcessBuilder pb = new ProcessBuilder(list);
pb.start();

案例2:

String rCmd = "Rscript.exe";
String rScriptName = "resources/MyScript.R";
List list = new ArrayList<>();
list.add(rCmd);
list.add(this.getClass().getClassLoader().getResource(rScriptName).toString());
ProcessBuilder pb = new ProcessBuilder(list);
pb.start();

下面的代码抛出异常:
案例3:

String rCmd = "Rscript.exe";
String rScriptName = "resources/MyScript.R";
List list = new ArrayList<>();
list.add(rCmd);
list.add(this.getClass().getClassLoader().getResource(rScriptName).toURI());
ProcessBuilder pb = new ProcessBuilder(list);
pb.start();

案例4:

File file = new File(this.getClass().getClassLoader().getResource(rScriptName).toURI());
List list = new ArrayList<>();
list.add(rCmd);
list.add(file);
ProcessBuilder pb = new ProcessBuilder(list);
pb.start();

输出:

Exception in thread "main" java.lang.ArrayStoreException
    at java.lang.System.arraycopy(Native Method)
    at java.util.ArrayList.toArray(ArrayList.java:361)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1005)  

下面的代码给出了我预期的输出但不想这样硬编码路径,因为我需要稍后在linux框中运行这段代码。

String rCmd = "Rscript.exe";
String rScriptName = "D:/MyScript.R";
ProcessBuilder pb = new ProcessBuilder(rCmd, rScriptName);
pb.start();

期待你需要的帮助!

1 个答案:

答案 0 :(得分:1)

String rCmd = "Rscript.exe";
        String rScriptName = "filename Without Resource";
        List list = new ArrayList<>();
        list.add(rCmd);
        list.add([Class name].class.getClassLoader().getResource(rScriptName).toURI().getPath());

正在工作。

进程构建器Expect String Argument因此尝试解析列表,除非它们是字符串,否则它将提供以下异常。

尝试     this.class.getClassLoader()。的getResource(rScriptName).toURI()。的getPath()

它将添加文件的绝对路径,并将执行。

Class ProcessBuilder