根据用户选择将流写入控制台或文件
本文关键字:控制台 文件 用户 选择 | 更新日期: 2023-09-27 18:14:05
abstract class Car
{
string Name;
//some other fields
abstract public void Details(Stream stream);
}
class Maruti : Car
{
int x;
//some other fields
public override void Details(Stream stream)
{
// to do
}
}
class Mercedes : Car
{
int y;
//some other fields
public override void Details(Stream stream)
{
// to do
}
}
我必须编写Details方法,这样如果流是控制台流,则输出显示在控制台,如果流是文件流,则输出写入文件。
我是这样做到的:
public override void Details(Stream stream)
{
string details = "Name : " + this.Name + Environment.NewLine ;
if (stream is FileStream)
{
TextWriter tmp = Console.Out;
StreamWriter sw2 = new StreamWriter(stream);
Console.SetOut(sw2);
Console.WriteLine(details);
Console.SetOut(tmp);
sw2.Close();
}
else
{
Console.WriteLine(details);
}
}
我在我的两个派生类中使用了上面的方法,并做了一些修改。有更好的办法吗?
您应该能够将Details
的整个主体替换为:
string details = "Name : " + this.Name;
StreamWriter sw = new StreamWriter(stream);
sw.WriteLine(details);
sw.WriteLine();
根据您是否希望在写入details
字符串后进一步使用传递的流,您可能还需要添加命令:
sw.Close();
说明:StreamWriter
来源于TextWriter
…Console.Out
的类型为TextWriter
。因此,您不必将控制台输出替换为您的临时流写入器,而是可以直接使用它来编写您的内容。
还请注意,当您将Environment.NewLine
添加到details
字符串时,您应该依赖于流自己的换行符,该换行符可能与环境中的换行符不同。如果你真的想要两个换行符,你应该像我上面的例子一样调用WriteLine
。
这看起来很不对。
如果你想写入控制台,你应该把从Console.Out
返回的流传递给Details()
,然后在Details()
的实现中总是写入流。
你可以这样命名它:
myCar.Details(Console.Out);