- `FileStream` 类
- `FileMode`
- `FileAccess`
- `FileShare`
- `StreamReader` 类和`StreamWriter`类
- `StreamReader` 类
- `StreamWriter`类
- 关于`using`
FileStream 类
FileStream <object_name> = new FileStream( <file_name>,
<FileMode Enumerator>, <FileAccess Enumerator>, <FileShare Enumerator>);
例如,创建一个 FileStream 对象 F 来读取名为 sample.txt 的文件:
FileStream F = new FileStream("sample.txt", FileMode.Open, FileAccess.Read, FileShare.Read);
注意FileMode和FileAccess的匹配问题
FileMode
FileMode 枚举定义了各种打开文件的方法。FileMode 枚举的成员有:
Append:打开一个已有的文件,并将光标放置在文件的末尾。如果文件不存在,则创建文件。
Create:创建一个新的文件。如果文件已存在,则删除旧文件,然后创建新文件。
CreateNew:指定操作系统应创建一个新的文件。如果文件已存在,则抛出异常。
Open:打开一个已有的文件。如果文件不存在,则抛出异常。
OpenOrCreate:指定操作系统应打开一个已有的文件。如果文件不存在,则用指定的名称创建一个新的文件打开。
Truncate:打开一个已有的文件,文件一旦打开,就将被截断为零字节大小。然后我们可以向文件写入全新的数据,但是保留文件的初始创建日期。如果文件不存在,则抛出异常。
FileAccess
FileAccess 枚举的成员有:
Read、ReadWrite 和 Write。
FileShare
FileShare 枚举的成员有:
Inheritable:允许文件句柄可由子进程继承。Win32 不直接支持此功能。
None:谢绝共享当前文件。文件关闭前,打开该文件的任何请求(由此进程或另一进程发出的请求)都将失败。
Read:允许随后打开文件读取。如果未指定此标志,则文件关闭前,任何打开该文件以进行读取的请求(由此进程或另一进程发出的请求)都将失败。但是,即使指定了此标志,仍可能需要附加权限才能够访问该文件。
ReadWrite:允许随后打开文件读取或写入。如果未指定此标志,则文件关闭前,任何打开该文件以进行读取或写入的请求(由此进程或另一进程发出)都将失败。但是,即使指定了此标志,仍可能需要附加权限才能够访问该文件。
Write:允许随后打开文件写入。如果未指定此标志,则文件关闭前,任何打开该文件以进行写入的请求(由此进程或另一进过程发出的请求)都将失败。但是,即使指定了此标志,仍可能需要附加权限才能够访问该文件。
Delete:允许随后删除文件。
StreamReader 类和StreamWriter类
StreamReader 类
在 C# 中提供了多种方法来读取字符流中的数据。以下是一些常用的 StreamReader 方法:
Read():从流中读取下一个字符,并将其作为整数值返回。如果到达了流的末尾,则返回 -1。
ReadLine():从流中读取一行字符,并将其作为字符串返回。如果到达了流的末尾,则返回 null。
ReadToEnd():从流的当前位置读取到末尾,并将所有字符作为字符串返回。
Peek():返回流中下一个可用的字符,但不将其从流中移除。这可以用于查看下一个字符而不实际读取它。
Close():关闭 StreamReader 对象和基础流,并释放与读取器关联的所有系统资源。
DiscardBufferedData():清除内部缓冲区。当内部缓冲区和流的位置不匹配时,可以调用此方法。
StreamWriter类
是System.IO命名空间中的一个用于写入文本到文件的类,它提供了多种方法来写入不同类型的数据到文件中,并且可以指定编码、是否追加等参数。StreamWriter的一些常用方法包括:
Write():将一个字符串写入流。
WriteLine():将一个字符串写入流,并在其后添加一个换行符。
Flush():清理当前写入器的所有缓冲区,并使所有缓冲数据写入基础流。这可以确保在程序继续执行之前,所有待写入的数据都已经被写入到目标位置。
Close():关闭当前StreamWriter对象和基础流。关闭StreamWriter对象后,你将无法再向其中写入数据。
Dispose():使所有缓冲数据写入基础流,并释放StreamWriter使用的非托管资源。这个方法还可以根据需要释放受管理的资源。当StreamWriter对象超出其作用域或被显式地调用Dispose方法时,这个方法会被自动调用
关于using
通常建议将其放在 using 语句块中,以确保流在使用完毕后被正确关闭和释放资源,即使发生异常也是如此。
例子
class TODO {public static void Main(String[] args) {try {string path = @"C:\Users\to_bo\Desktop\1.txt";using (StreamWriter sw = new StreamWriter(path, true)) {sw.WriteLine("and YOU!");}using (StreamReader sr = new StreamReader(path)) {string line;while((line = sr.ReadLine()) != null) {Console.WriteLine(line);}}} catch (Exception e) {Console.WriteLine(e.Message);}}
}