关键点
- C# 文件输入和输出是通过流(Stream)实现的,主要使用
System.IO命名空间中的类。 - 研究表明,常用类包括
FileStream(基本文件操作)、StreamReader/StreamWriter(文本文件读写)和BinaryReader/BinaryWriter(二进制文件读写)。 - 证据显示,最佳实践是使用
using语句确保资源释放,并注意文件路径和权限设置。
文件输入输出的基本概念
C# 中的文件输入和输出是指从文件中读取数据(输入)或向文件中写入数据(输出)。这些操作通常通过流模型实现,流是字节序列的抽象,方便处理文件、网络或内存中的数据。输入流用于读取,输出流用于写入。
如何操作文件
- 打开文件:使用
FileStream类,指定文件路径和模式(如创建或打开)。 - 读取文件:用
StreamReader读取文本,或BinaryReader读取二进制数据。 - 写入文件:用
StreamWriter写入文本,或BinaryWriter写入二进制数据。 - 关闭文件:使用
using语句自动关闭流,确保资源释放。
示例:
using System.IO;
using (StreamWriter writer = new StreamWriter("test.txt"))
{
writer.WriteLine("Hello, world!");
}
using (StreamReader reader = new StreamReader("test.txt"))
{
string line = reader.ReadLine();
Console.WriteLine(line); // 输出:Hello, world!
}
参考资源
C# 文件的输入与输出详细讲解
一、背景与定义
C# 中的文件输入和输出(I/O)是指程序与文件系统交互的过程,包括从文件中读取数据(输入)和向文件中写入数据(输出)。这些操作是通过流(Stream)模型实现的,流是字节序列的抽象,表示数据的来源或目的地。C# 提供了 System.IO 命名空间,包含了各种类,用于执行文件操作,如创建、删除、读取、写入文件等。文件操作是编程中常见的任务,C# 的文件 I/O 机制通过流模型,使得文件的读写操作更加灵活和高效。
二、文件流(FileStream)
FileStream 类是用于读写文件的基本类,它继承自 Stream 类。以下是 FileStream 构造函数的常用参数:
path:文件路径mode:文件打开模式(FileMode枚举),如Open、Create、Append等access:文件访问权限(FileAccess枚举),如Read、Write、ReadWriteshare:文件共享权限(FileShare枚举),如None、Read、ReadWrite
示例:
using System.IO;
FileStream fs = new FileStream("test.txt", FileMode.Open, FileAccess.Read);
FileMode 枚举的常用值如下表所示:
| 模式 | 描述 |
|---|---|
| Create | 创建新文件,如果文件已存在则覆盖 |
| CreateNew | 创建新文件,如果文件已存在则抛出异常 |
| Open | 打开现有文件,如果文件不存在则抛出异常 |
| OpenOrCreate | 打开现有文件,如果不存在则创建 |
| Truncate | 打开现有文件并清空内容,如果不存在则抛出异常 |
三、文本文件的读写
1. StreamReader 类
StreamReader 类用于从文本文件中读取字符数据。它提供了如 ReadLine()、ReadToEnd() 等方法,适合处理文本格式的文件。
常用方法:
| 方法 | 描述 |
|---|---|
| Read() | 读取一个字符 |
| ReadLine() | 读取一行文本 |
| ReadToEnd() | 读取文件剩余所有内容 |
示例:
using System.IO;
using (StreamReader sr = new StreamReader("test.txt"))
{
string line = sr.ReadLine();
Console.WriteLine(line);
}
2. StreamWriter 类
StreamWriter 类用于向文本文件中写入字符数据。它提供了如 WriteLine()、Write() 等方法。
常用方法:
| 方法 | 描述 |
|---|---|
| Write() | 写入文本 |
| WriteLine() | 写入一行文本并换行 |
| Flush() | 刷新缓冲区,确保数据写入 |
示例:
using System.IO;
using (StreamWriter sw = new StreamWriter("test.txt"))
{
sw.WriteLine("Hello, world!");
}
四、二进制文件的读写
1. BinaryReader 类
BinaryReader 类用于从二进制文件中读取基本数据类型,如整数、浮点数等。
常用方法:
| 方法 | 描述 |
|---|---|
| ReadBoolean() | 读取布尔值 |
| ReadInt32() | 读取 32 位整数 |
| ReadDouble() | 读取双精度浮点数 |
示例:
using System.IO;
using (BinaryReader br = new BinaryReader(File.Open("test.bin", FileMode.Open)))
{
int number = br.ReadInt32();
Console.WriteLine(number);
}
2. BinaryWriter 类
BinaryWriter 类用于向二进制文件中写入基本数据类型。
常用方法:
| 方法 | 描述 |
|---|---|
| Write(Boolean) | 写入布尔值 |
| Write(Int32) | 写入 32 位整数 |
| Write(Double) | 写入双精度浮点数 |
示例:
using System.IO;
using (BinaryWriter bw = new BinaryWriter(File.Open("test.bin", FileMode.Create)))
{
bw.Write(123);
}
五、文件和目录操作
C# 提供了 File 和 Directory 类,用于执行文件和目录的常见操作。
1. File 类
File 类提供了静态方法,用于文件操作。以下是常用方法:
| 方法 | 描述 |
|---|---|
| Exists(path) | 检查文件是否存在 |
| Create(path) | 创建新文件 |
| Delete(path) | 删除文件 |
| Copy(source, dest) | 复制文件 |
| Move(source, dest) | 移动文件 |
2. Directory 类
Directory 类提供了静态方法,用于目录操作。以下是常用方法:
| 方法 | 描述 |
|---|---|
| Exists(path) | 检查目录是否存在 |
| CreateDirectory(path) | 创建目录 |
| Delete(path) | 删除目录 |
| GetFiles(path) | 获取目录中的文件列表 |
| GetDirectories(path) | 获取目录中的子目录列表 |
六、最佳实践
- 使用
using语句:确保文件流在使用后被正确关闭和释放,避免资源泄漏。 - 选择合适的文件操作类:对于文本文件,使用
StreamReader和StreamWriter;对于二进制文件,使用BinaryReader和BinaryWriter。 - 注意文件路径:确保文件路径正确,考虑使用绝对路径或相对路径,并处理可能的路径相关异常。
- 权限管理:注意文件访问权限,特别是在多用户环境中,确保有足够的读写权限。
- 异常处理:在文件操作中加入异常处理,捕获如
FileNotFoundException、IOException等异常。
七、完整示例
以下是一个完整的示例,展示了文件写入和读取的操作:
using System;
using System.IO;
class Program
{
static void Main()
{
try
{
// 写入文件
using (StreamWriter writer = new StreamWriter("test.txt"))
{
writer.WriteLine("Hello, world!");
}
// 读取文件
using (StreamReader reader = new StreamReader("test.txt"))
{
string line = reader.ReadLine();
Console.WriteLine(line); // 输出:Hello, world!
}
}
catch (Exception ex)
{
Console.WriteLine("发生异常:" + ex.Message);
}
}
}
八、总结
C# 的文件输入和输出通过流模型实现,System.IO 命名空间提供了丰富的类来支持各种文件操作。开发者可以通过学习这些类和方法来实现对文件的读写操作。建议结合实际代码示例进行练习,以加深理解。
参考资源