gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:39:51 34 4
gpt4 key购买 nike

我正在尝试运行进程构建器来执行 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();

期待您在这方面急需的帮助!

最佳答案

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());

正在工作。

流程构建器期望字符串参数因此尝试解析列表,除非它们是字符串,否则它将给出以下异常。

尝试一下 this.class.getClassLoader().getResource(rScriptName).toURI().getPath()

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

Class ProcessBuilder

关于java - 如何将文件的绝对(完整)路径传递给 ProcessBuilder 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48666183/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com