java - 带有 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 运行?任何帮助,将不胜感激
解决方案
您可以通过 InputStream 读取脚本文件并将其写入系统临时目录下的临时文件,并按以下方式执行该文件:Runtime.getRuntime.exec("/bin/sh " + tempFilePath);
关于将脚本文件重写为另一个临时文件的原因,您说您是通过直接运行jar文件来执行程序,因此脚本文件被打包到jar文件中,java不会将jar文件解包到文件系统中。为了让 cmd.exe 可以访问脚本文件,我们需要手动重写脚本文件。
顺便说一句,您可以从系统属性中获取系统临时目录路径,或者使用 apache common.io: FileUtils.getTempDirectory()
。
推荐阅读
- html - 托管 R Shiny 应用程序
- reactjs - 反应路由器切换基本名称
- java - 使用 GraalVM native-image-maven-plugin 构建本机映像时出错
- rust - 支持可能生命周期的高阶函数
- python - 如何将随机生成的数字存储在文本文件中?(Python)
- google-sheets - 希望根据评分/分数创建过滤器,以用于播客的存档
- async-await - 为什么我的 catch 块没有执行?
- python - 我有一个随机数生成器,它从列表中获取一个字符串,但它不起作用
- r - 由于 URL 的“请求过多”,如何修复 R CMD 检查传入可行性的注意事项
- sql - KSQL WINDOW TUMBLING 产生奇怪的键