接着上面介绍的,在对文件进行读写操作时,我们还可以重定向标准的数据流。重定向运算符“<”和“>”是由操作系统提供的,因此如果操作系统支持I/O重定向,则可以重定向标准的输入输出,而不必更改程序。另外,Console类也为我们提供了三个重定向的方法,它们分别是Console.SetIn,Console.SetOut,Console.SetError,它们的函数定义如下:
static void SetIn(TextReader newIn);
static void SetOut(TextWriter newOut);
static void SetError(TextWriter newError);
例如:
StreamWriter log_out=new StreamWriter("log.txt");
Console.SetOut(log_out);
Console.WriteLine("This is the start of log file");
这时候,我们就会发现,输出并不是显示在控制台上的,而是输出到我们指定的log.txt文本文件中了。
到目前为止,我们不管是基于字符还是基于字节读取文件,都是按顺序进行存取的,但是,C#中提供给了我们随机读取文件的方法。在FileStream类中,定义了Seek()方法,函数的原型如下:
long Seek(long offset,SeekOrigin origin);
其中offset是指在origin指定位置后的offset个字节,SeekOrigin是个枚举类型,其值及对应的含义如下:
值 | 含义 |
SeekOrigin.Begin | 在文件的开始位置开始查找 |
SeekOrigin.Current | 从文件当前位置开始查找 |
SeekOrigin.End | 从文件的末尾开始查找 |
如果在查找的过程中出错,就会抛出IOException异常,如果底层的数据流不支持位置查找,则会抛出NotSupportedException异常。
除了上面介绍的定位方法外,我们还可以使用流类的Position属性,Position属性是一个读写属性,既可以获得当前位置,也可以更改当前位置。
上面我们介绍了两种实现TextReader和TextWriter类的基于字符的数据流StreamReader和StreamWriter,接下来我们讲述一下另外的两种数据流。
在执行基于内存的I/O操作时,使用字符串要比使用字节数组作为底层存储要简单的多,这时候我们可以使用StringReader和StringWriter类。StringReader继承了TextReader类,StringWriter继承了TextWriter类,它们可以使用基类定义的方法。
StringReader类的构造函数如下:
StringReader(string s);
s是要初始化的字符串。
StringWriter类的构造函数:
StringWriter();
StringWriter(StringBuilder sb);
StringWriter(IFormatProvider formatprovider);
StringWriter(StringBuilder sb,IFormatProvider formatprovider);
第一种构造函数创建一个空的StringWriter对象,第二种以一个StringBuilder对象初始化一个StringWriter对象。
最后需要提醒大家的是:除了上面所述的各种读取文件的方法外,File类还提供了很多的文件操作的静态方法,包含文件的创建,复制,移动,删除,加密,解密,设置和修改文件访问时间等等,这些方法操作起来更加简单。