首页 > 解决方案 > 带有 shell 脚本的 Java InputStream 作为 Runtime.getRunTime().exec() 的输入

问题描述

我正在使用 Jar 文件运行 java 程序。在这个打包的 jar 文件中,我有我的 shell 脚本。我知道访问文件的最佳方法是通过 getResourcesAsStream 因为我无法通过常规目录结构访问它。所以这就是我正在使用的:

    InputStream input = this.getClass().getResourceAsStream("/script/sample_script.sh");

但是,我知道如何执行此操作的唯一方法是使用循环和 bufferReader 逐行浏览脚本。I 像“If”或“While”循环这样的语句让我出错。有没有办法输入流来达到预期的结果。

这是我当前的代码:

InputStream input = this.getClass().getResourceAsStream("/script/sample_script.sh");
BufferedReader brCmd = new BufferedReader(new InputStreamReader(input));
String cmd;
while ((cmd = brCmd.readLine()) != null){
     proc = Runtime.getRuntime().exec(cmd);
     proc.waitFor();
}

我尝试将整个文件逐行连接到一个字符串并使用它,但它似乎不起作用。如何让我的脚本文件使用 inputStream 运行?任何帮助,将不胜感激

标签: javashell

解决方案


您可以通过 InputStream 读取脚本文件并将其写入系统临时目录下的临时文件,并按以下方式执行该文件:Runtime.getRuntime.exec("/bin/sh " + tempFilePath);

关于将脚本文件重写为另一个临时文件的原因,您说您是通过直接运行jar文件来执行程序,因此脚本文件被打包到jar文件中,java不会将jar文件解包到文件系统中。为了让 cmd.exe 可以访问脚本文件,我们需要手动重写脚本文件。

顺便说一句,您可以从系统属性中获取系统临时目录路径,或者使用 apache common.io: FileUtils.getTempDirectory()


推荐阅读