Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将参数传递给Java进程?_Java - Fatal编程技术网

如何将参数传递给Java进程?

如何将参数传递给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

我有一个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-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”的编码

您需要刷新流,而且它可能希望在密码末尾有一个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”的编码

正如已经指出的,你可以考虑使用类库来在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
方法是静态导入的 如果您决定采用第三方库的方法,我建议您尝试一下我自己的现代替代方案,以取代和其他方法。它被称为无依赖项,并且是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的主题之前,您需要进一步充实这个问题。“未取得结果”并不是对出错原因的恰当描述——我们如何知道您的计算机上发生了什么?你是如何传递“论点”的?显示所有相关代码。如果进程试图读取一行,并且如果进程专门从控制台读取,则根本无法写入该行,则需要传递相应的行终止符。您需要发布一些代码。虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会无效。虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会无效。虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会无效。虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接以供参考。如果链接页面发生更改,则仅链接的答案可能无效。