如何将参数传递给Java进程?
我有一个Java应用程序,它创建并运行一个进程(x.exe)。执行进程x时,它会提示用户输入密码。如何将此密码传递给用户 我尝试使用进程的如何将参数传递给Java进程?,java,Java,我有一个Java应用程序,它创建并运行一个进程(x.exe)。执行进程x时,它会提示用户输入密码。如何将此密码传递给用户 我尝试使用进程的OutputStream,并将密码写入流,但进程仍然没有运行 Runtime r=Runtime.getRuntime(); Process p=r.exec("x.exe"); p.getOutputStream()//.use to pass the arguments 您可以尝试library-like与外部进程进行交互您可以尝试library-lik
OutputStream
,并将密码写入流,但进程仍然没有运行
Runtime r=Runtime.getRuntime();
Process p=r.exec("x.exe");
p.getOutputStream()//.use to pass the arguments
您可以尝试library-like与外部进程进行交互您可以尝试library-like与外部进程进行交互您需要刷新流,并且,它可能希望在密码末尾使用CR来模拟用户在密码末尾键入的ENTER键。这在Linux中适用:
Runtime r = Runtime.getRuntime();
Process p = r.exec("myTestingExe");
p.getOutputStream().write("myPassword\n".getBytes()); // notice the `\n`
p.getOutputStream().flush();
一些警告:
- 这在Linux中工作,结尾是“\n”,可能在Windows中您需要\r(老实说,我不确定Windows如何处理输入中的“ENTER”键)
- 我使用的是
,但更完整的值应该是“myPassword\n”.getBytes()
新字符串(“myPassword”.getBytes(),Charset.forName(“MyCharsetName”)代码>(其中“MyCharsetName”是受支持的编码)如果您使用的是类似“UTF-8”的编码
Runtime r = Runtime.getRuntime();
Process p = r.exec("myTestingExe");
p.getOutputStream().write("myPassword\n".getBytes()); // notice the `\n`
p.getOutputStream().flush();
一些警告:
- 这在Linux中工作,结尾是“\n”,可能在Windows中您需要\r(老实说,我不确定Windows如何处理输入中的“ENTER”键)
- 我使用的是
,但更完整的值应该是“myPassword\n”.getBytes()
新字符串(“myPassword”.getBytes(),Charset.forName(“MyCharsetName”)代码>(其中“MyCharsetName”是受支持的编码)如果您使用的是类似“UTF-8”的编码
正如已经指出的,你可以考虑使用类库来在java程序和产卵操作系统进程之间进行交互。基本上,您需要等待直到流程输入流中的密码提示可用,然后将行尾终止的密码写入流程输出流
如果您决定采用第三方库的方法,我建议您尝试一下我自己的现代替代方案,以取代和其他方法。它被称为无依赖项,并且是Apache许可的 以下是使用expect库的一个可能示例: Process process = Runtime.getRuntime().exec("...");
Expect expect = new ExpectBuilder()
.withInputs(process.getInputStream())
.withOutput(process.getOutputStream())
.withErrorOnTimeout(true)
.build();
expect.expect(contains("Password:"));
expect.sendLine("secret");
expect.close();
注意:
contains
方法是静态导入的正如已经指出的,你可以考虑使用类库来在java程序和产卵操作系统之间进行交互。基本上,您需要等待直到流程输入流中的密码提示可用,然后将行尾终止的密码写入流程输出流
如果您决定采用第三方库的方法,我建议您尝试一下我自己的现代替代方案,以取代和其他方法。它被称为无依赖项,并且是Apache许可的
以下是使用expect库的一个可能示例:
Process process = Runtime.getRuntime().exec("...");
Expect expect = new ExpectBuilder()
.withInputs(process.getInputStream())
.withOutput(process.getOutputStream())
.withErrorOnTimeout(true)
.build();
expect.expect(contains("Password:"));
expect.sendLine("secret");
expect.close();
注意:
contains
方法是静态导入的 在这个问题成为StackOverflow的主题之前,您需要进一步充实这个问题。“未取得结果”并不是对出错原因的恰当描述——我们如何知道您的计算机上发生了什么?你是如何传递“论点”的?显示所有相关代码。如果进程试图读取一行,并且如果进程专门从控制台读取,则根本无法写入该行,则需要传递相应的行终止符。您需要发布一些代码。在这个问题成为StackOverflow的主题之前,您需要进一步充实这个问题。“未取得结果”并不是对出错原因的恰当描述——我们如何知道您的计算机上发生了什么?你是如何传递“论点”的?显示所有相关代码。如果进程试图读取一行,并且如果进程专门从控制台读取,则根本无法写入该行,则需要传递相应的行终止符。您需要发布一些代码。虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会无效。虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会无效。虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会无效。虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接以供参考。如果链接页面发生更改,则仅链接的答案可能无效。