首页 > 解决方案 > 如何获取以 C# 开头的 Java 程序的实时输入/输出

问题描述

我有一个需要执行 Java 程序的 C# 程序,但是,在执行 Java 应用程序时,没有显示输出。我还需要这个输出是实时的,以及输入。

拿这个示例代码:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Executing \"echo test\":");
        EchoRedirectDemo();
        Console.WriteLine("Executing \"java -version\":");
        JavaRedirectDemo();
    }

    static void JavaRedirectDemo()
    {
        ProcessStartInfo processStartInfo = new ProcessStartInfo("java")
        {
            Arguments = "-version",
            RedirectStandardOutput = true,
            RedirectStandardError = true,
            RedirectStandardInput = true
        };

        Process process = Process.Start(processStartInfo);

        process.WaitForExit();
        
        Console.WriteLine(process.StandardOutput.ReadToEnd());
    }
    
    static void EchoRedirectDemo()
    {
        ProcessStartInfo processStartInfo = new ProcessStartInfo("echo")
        {
            Arguments = "test",
            RedirectStandardOutput = true,
            RedirectStandardError = true,
            RedirectStandardInput = true
        };

        Process process = Process.Start(processStartInfo);

        process.WaitForExit();
        
        Console.WriteLine(process.StandardOutput.ReadToEnd());
    }
}

它会运行echo test得很好并重定向 in/out/err,但命令上不会有 in/out/err java -v,如下所示:

Executing "echo test":
test

Executing "java -version":

关于如何解决这个问题的任何想法?

标签: javac#.net.net-coresystem.diagnostics

解决方案


CliWrap可以为您简化这一过程。

using System.Text;
using System;
using CliWrap;
using System.Threading.Tasks;

namespace proj
{
   public class Program
    {
        public static async Task Main(string[] args)
        {
            var stdOutBuffer = new StringBuilder();
            var stdErrBuffer = new StringBuilder();

            var result = await Cli.Wrap("java")
            .WithArguments("-version")
            .WithWorkingDirectory("/")
            .WithStandardOutputPipe(PipeTarget.ToStringBuilder(stdOutBuffer))
            .WithStandardErrorPipe(PipeTarget.ToStringBuilder(stdErrBuffer))
            .ExecuteAsync();

            var stdOut = stdOutBuffer.ToString(); 
            var stdErr = stdErrBuffer.ToString();
            Console.WriteLine(stdOut);
            Console.WriteLine(stdErr);

        }
    }
}

输出

java version "1.8.0_301"
Java(TM) SE Runtime Environment (build 1.8.0_301-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.301-b09, mixed mode)

推荐阅读