记得以前在DOS中,执行一个命令既可以是在DOS控制符下手动敲入一句句命令,回车执行;又可以写一个批处理,然后批量执行。实际上在C#(或者)VB.NET中,Console也可以处理一个批文件的效果(批量从一个文件中读取结果)。
假设你有一个文本文件,里边存放以下内容:
Hello
Word
Wei_Dong
…………
那么你可以这样做——
[C#]
StreamReader sr = new StreamReader(new FileStream("d:\\log.txt",FileMode.OpenOrCreate)); Console.SetIn(sr); Console.WriteLine(Console.In.ReadToEnd());
[VB.NET]
Dim sr As New StreamReader(New FileStream("d:\log.txt", FileMode.OpenOrCreate)) Console.SetIn(sr) Console.WriteLine(Console.[In].ReadToEnd())
这里解释一下——Console.ReadLine默认是从键盘流中读取内容,通过WriteLine输出到屏幕;因此我们要做的是把“键盘流”改成自定义的你那个特定的StreamReader对象(第一句代码);然后通过SetIn方法改变Console读取流的位置从而使得Console从“文件流”中读取内容。设想一下如果有一批学生成绩要处理,你可以预先写入文本文件中,然后读出处理,再使用Console.WriteLine输出即可。
注意这里的窍门是——Console.In通过SetIn方法改变Reader的对象(从默认键盘流到文件流)。然后使用In(StreamReader的ReadToEnd())方法即可。实际上如果只有一句话,你完全可以使用Console.ReadLine(),因为它默认就是调用了In的ReadLine()方法。
同样地,我们也可以联想到如果我不想要Console输出内容到屏幕,而是到其它某个地方(比如做日志记录等)。那么我们完全可以——
[C#]
StreamWriter sw = new StreamWriter(new FileStream("d:\\log.txt", FileMode.Append)); Console.SetOut(sw); Console.WriteLine("1234567"+Console.Out.NewLine+"7654321"+Console.Out.NewLine); Console.Out.Close();
[VB.NET]
Dim sw As New StreamWriter(New FileStream("d:\log.txt", FileMode.Append)) Console.SetOut(sw) Console.WriteLine(("1234567" & Console.Out.NewLine & "7654321" & vbCr & vbLf & "1") + Console.Out.NewLine) Console.Out.Close()
注意:
1)换行输出用NewLine属性而不能用\n,因为C#中写入文本在Windows中一个“换行”等于(回车+换行)。你可以等效于“\r\n”(VB.NET中可以用vbCr+vbLf)。
2)输出流Out必须关闭或者调用Flush方法,不然无法写入文件,只是在缓冲区中。