1

プレーン テキスト キーをサード パーティの外部プログラムに渡して、出力を文字列にキャプチャしようとしています。サードパーティのプログラムが入力を「通常」として受け入れないことを除いて、すべてが機能しているようです。「入力が長すぎます」というエラーが表示されます。ただし、bash シェルで同じバイナリに対して同じテキスト セットを実行すると、意図したとおりに動作します。余分な文字を追加するものは何も見つからないようです。

私はこの例に従っています:Apache Commons Execで起動された実行可能ファイルに文字列引数をパイプする方法は?

public String run(List<String> keys) throws ExecuteException, IOException{

    //String text = String.join(System.lineSeparator(), keys);  
    String text = "9714917";
    CommandLine cmd = new CommandLine("/third/party/bin/program");

    Executor executor = new DefaultExecutor();
    ByteArrayOutputStream stdout = new ByteArrayOutputStream();
    ByteArrayOutputStream stderr = new ByteArrayOutputStream();
    ByteArrayInputStream stdin = new ByteArrayInputStream(text.getBytes("UTF-8"));

    PumpStreamHandler streamHandler = new PumpStreamHandler(stdout, stderr, stdin);

    executor.setStreamHandler(streamHandler);
    executor.setWatchdog(new ExecuteWatchdog(10000));
    executor.execute(cmd,environment);


return stdout.toString("UTF-8");
}

私が正しければ、これはシェルで入力するのと同じはずです

echo "9714917" | /third/party/bin/program 

動作します。stderr を正常に出力でき、stdout を取得することもできます (キーが拒否されたため、これはたまたま空白になっています)。

4

1 に答える 1

1

サードパーティのプログラムでは、入力ストリームに終了する新しい行が必要なため (echoコマンドがその出力に配置されるため)、次のように動作するはずです (@Neurobug によって確認されています)。

ByteArrayInputStream stdin = new ByteArrayInputStream((text + "\n").getBytes("UTF-8"));
于 2015-05-20T18:36:46.023 に答える