C# 如何获取已经输出到控制台上的内容?(单行)

在 C# 中,直接获取已经输出到控制台上的内容是比较困难的,因为标准输出流是单向的,默认情况下没有提供简单的方法来读取已经输出的内容。不过,可以通过一些技巧和方法来实现这一目标。

方法一:使用 Console.SetOut 重定向输出流

通过重定向 Console 输出流到一个可写的 StringWriter,我们可以捕获输出的内容。这是实现此目的的一种常见方法。

csharp
using System; using System.IO; class Program { static void Main() { // 创建一个 StringWriter 来捕获控制台输出 StringWriter stringWriter = new StringWriter(); // 重定向控制台输出到 StringWriter Console.SetOut(stringWriter); // 输出到控制台(实际上输出到了 StringWriter) Console.WriteLine("Hello, World!"); // 获取已经输出的内容 string output = stringWriter.ToString(); // 打印捕获的输出内容 Console.WriteLine("Captured Output: " + output); // 重置控制台输出流回标准输出 TextWriter originalOutput = Console.Out; Console.SetOut(originalOutput); // 再次输出到控制台,验证重置后的输出流 Console.WriteLine("Back to original console output."); } }

解释

  1. 创建一个 StringWriter 实例来捕获控制台输出。
  2. 使用 Console.SetOut 方法将控制台的输出流重定向到 StringWriter
  3. 进行正常的 Console.WriteLine 操作,此时输出将被捕获到 StringWriter 中。
  4. 使用 StringWriter.ToString() 方法获取捕获的输出内容。
  5. 将控制台输出流重置回原始的标准输出流。

方法二:使用 Console.SetOutStreamWriter

StringWriter 类似,我们也可以使用 StreamWriter 来捕获控制台输出。

csharp
using System; using System.IO; class Program { static void Main() { // 创建一个 MemoryStream 和 StreamWriter 来捕获控制台输出 using (MemoryStream memoryStream = new MemoryStream()) using (StreamWriter streamWriter = new StreamWriter(memoryStream)) { // 重定向控制台输出到 StreamWriter Console.SetOut(streamWriter); // 输出到控制台(实际上输出到了 StreamWriter) Console.WriteLine("Hello, World!"); // 刷新 StreamWriter 缓冲区 streamWriter.Flush(); // 获取已经输出的内容 memoryStream.Position = 0; using (StreamReader streamReader = new StreamReader(memoryStream)) { string output = streamReader.ReadToEnd(); Console.WriteLine("Captured Output: " + output); } } // 重置控制台输出流回标准输出 TextWriter originalOutput = Console.Out; Console.SetOut(originalOutput); // 再次输出到控制台,验证重置后的输出流 Console.WriteLine("Back to original console output."); } }

解释

  1. 创建一个