当前位置: 首页 > 面试题库 >

为什么要避免在Java中使用Runtime.exec()?

方心思
2023-03-14
问题内容

Process p = Runtime.getRuntime().exec(command);
is = p.getInputStream();
byte[] userbytes = new byte[1024];
is.read(userbytes);

我想从java在linux os中执行shell命令。但是Pmd报告说不要使用Java Runtime.exec()。为什么?是什么原因
?Runtime.exec()是否有其他选择?


问题答案:

除非您使用古老的JVM,java.lang.ProcessBuilder否则可以更轻松地指定进程,设置其环境,生成它并处理其文件描述符。

此类用于创建操作系统进程。

每个ProcessBuilder实例管理流程属性的集合。该start()方法Process使用这些属性创建一个新实例。start()可以从同一实例重复调用该方法,以创建具有相同或相关属性的新子流程。

启动使用默认工作目录和环境的新进程很容易:

 Process p = new ProcessBuilder("myCommand", "myArg").start();

这是一个使用修改后的工作目录和环境启动流程的示例:

      ProcessBuilder pb = new ProcessBuilder("myCommand", "myArg1",
 "myArg2");
      Map<String, String> env = pb.environment();
      env.put("VAR1", "myValue");
      env.remove("OTHERVAR");
      env.put("VAR2", env.get("VAR1") + "suffix");
      pb.directory(new File("myDir"));
      Process p = pb.start();


 类似资料:
  • 问题内容: 通常我会尽可能避免转换类型,因为我认为这是不良的编码实践,并且可能会导致性能下降。 但是,如果有人要我解释为什么会这样,我可能会像前灯中的鹿一样看它们。 那么,为什么/何时铸造不好? 它对于Java,C#,C ++是通用的,还是每个不同的运行时环境都按照自己的方式处理? 欢迎使用任何语言的细节,例如为什么在c ++中不好? 问题答案: 您已经用三种语言标记了这三种语言,答案在三种语言之

  • 在React中,我尝试了两种方法: 然后更改状态this.setState(this.state) 克隆状态,更改状态克隆,然后更改此.setState(stateClone) 它们都起作用,产生相同的结果。为什么建议(在文档中)设置为状态克隆(使用Object.assign),而不是设置为状态本身?状态的对象标识在React中重要吗(没有Redux)?似乎只要调用setState,不管状态对象标

  • 我的公司不允许使用Mockito。在单元测试中验证。甚至有一个定制的声纳规则 规则如下 应该通过断言来验证结果,而不是使用“验证到执行”过程验证。因为如果我们验证流程,在流程更改后需要更多的努力来维护测试,但输入和输出保持不变。确保每一行代码都对结果有影响,并断言结果以证明逻辑正确 不合规代码示例 合规解决方案 对于数据库或中间件操作,断言使用嵌入式数据库或中间件成功写入数据。 对于restful

  • 问题内容: 我已经在多个地方多次看到过这种情况,但是从未找到令人满意的解释来说明为什么会这样。 因此,希望这里会介绍一个。为什么我们(至少通常)不使用和? 编辑:我看到人们以为这个问题与Web服务器有关,但事实并非如此。我可以理解为什么传递给未经处理的字符串可能很糟糕。在非Web应用程序中不好吗? 问题答案: 通常有更清晰,更直接的方法来获得相同的效果。如果构建复杂的字符串并将其传递给,则代码将难

  • 对于与PropertyValueFactory相关的问题,许多回答(和评论)建议避免使用该类和其他类似类。使用这个类有什么问题?

  • 问题内容: jslint工具的提示之一是: ++和- 已知++(递增)和-(递减)运算符会通过鼓励过多的技巧而导致不良代码。在支持病毒和其他安全威胁方面,它们仅次于错误的体系结构。有一个plusplus选项禁止使用这些运算符。 我知道像这样的PHP构造可能很容易导致一次错误的错误,但是我找不到比a 或更好的控制循环的方法。 jslint是否突出显示它们,是因为有些相似的语言缺少“”和“”语法或以不