这可能很难理解,但我希望在控制台C#app中获得java应用程序的输出。
当您在C#控制台应用程序中使用Process.Start启动Java应用程序时,Java应用程序将获得控制权,并且所有行都使用System.Out.Println()编写。
我想启动一个java应用程序,使它成为System.out.println()存储在变量中而不打印,然后使用Console.WriteLine()
重新打印变量允许我改写。#1使用process.start在c#console app中启动java app。 #2取消java尝试输出使用System.out.prinln()输出的内容,而不是将其存储在变量/字符串中。 #3使用Console.WriteLine()重新打印该字符串。
重定向标准输出不适用于此。
如果你想知道,这是为了我的世界bukkit。
答案 0 :(得分:3)
Java应用程序:
public class JavaApplication {
public static void main(String[] args) {
System.out.println("Java application outputs something into stdout");
System.err.println("Java application outputs something into stderr");
}
}
C#应用程序
using System;
using System.Diagnostics;
namespace CaptureProcessStdOutErr
{
public class Program
{
public static void Main(string[] args)
{
var startInfo = new ProcessStartInfo("java", "JavaApplication") // proper path to java, main java class, classpath, jvm parameters, etc must be specified or use java -jar jarName.jar if packaged into a single jar
{
RedirectStandardError = true,
RedirectStandardOutput = true,
UseShellExecute = false
};
var process = Process.Start(startInfo);
process.WaitForExit();
Console.WriteLine("Captured stderr from java process:");
Console.WriteLine(process.StandardError.ReadToEnd());
Console.WriteLine();
Console.WriteLine("Captured stdout from java process");
Console.WriteLine(process.StandardOutput.ReadToEnd());
}
}
}
这假设java.exe在PATH中。
编译JavaApplication并将JavaApplication.class文件放在C#应用程序旁边(CaptureProcessStdOutErr.exe)
运行CaptureProcessStdOutErr.exe
输出:
Captured stderr from java process:
Java application outputs something into stderr
Captured stdout from java process
Java application outputs something into stdout