FileStream文件流
FileStream
类是公开以文件为主的 Stream,既支持同步读写操作,也支持异步读写操作。 命名空间:System.IO
声明方式
FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
参数说明
-
filePath 提供待读取文件的路径
-
FileMode 枚举定义了各种打开文件的方式
-
Append:打开一个已有文件,并将光标放置在文件的末尾。如果文件不存在,则创建文件;
-
Create:创建一个新的文件。如果文件已存在,则删除旧文件,然后创建新文件;
-
CreateNew:指定操作系统应创建一个新的文件,如果文件已存在,则抛出异常;
-
Open:打开一个已有文件,如果文件不存在,则抛出异常;
-
OpenOrCreate:指定操作系统应打开一个已有的文件,如果文件不存在,则用指定名称创建一个新的文件打开;
-
Truncate:打开一个已有的文件,文件一旦打开,就将被截断为零字节大小。然后我们可以向文件写入全新的数据,但是保留文件的初始创建日期。如果文件不存在,则抛出异常。
-
-
FileAccess 枚举定义了各种访问权限
-
Read:获得对文件的读取访问权限,进而可以从文件中读取数据(只读)。
-
ReadWrite:获得读取、写入文件的访问权限,进而可以从文件中读取、写入数据(可读可写)。
-
Write:获取对文件的写入访问权限,进而可以将数据写入文件中(只写)。
-
-
FileShare 枚举定义了对同一文件可以具有的访问类型
-
Inheritable:允许文件句柄可由子进程继承。
-
None:谢绝共享当前文件。文件关闭前,打开该文件的任何请求(由此进程或另一进程发出的请求)都将失败。
-
Read:允许随后打开文件读取。如果未指定此标志,则文件关闭前,任何打开该文件以进行读取的请求都将失败。但是,即使指定了此标志,仍可能需要附加权限才能够访问该文件。
-
ReadWrite:允许随后打开文件读取或写入。如果未指定此标志,则文件关闭前,任何打开该文件以进行读取或写入的请求都将失败。但是,即使指定了此标志,仍可能需要附加权限才能够访问该文件。
-
Write:允许随后打开文件写入。如果未指定此标志,则文件关闭前,任何打开该文件以进行写入的请求都将失败。但是,即使指定了此标志,仍可能需要附加权限才能够访问该文件。
-
Delete:允许随后删除文件。
-
StreamReader类:读取文件流
在 C# 语言中,StreamReader 类用于从流中读取字符串。它继承自 TextReader 类。
构造函数
StreamReader 类的构造方法有很多,常用的构造方法有如下四种:
构造方法 | 说明 |
---|---|
StreamReader(Stream stream) | 为指定的流创建StreamReader类的实例 |
StreamReader(string path) | 为指定路径的文件创建StreamReader类的实例 |
StreamReader(Stream stream,Encoding encoding) | 用指定的字符编码为指定的流初始化StreamReader类的实例 |
StreamReader(String path, Encoding encoding) | 用指定的字符编码为指定的文件初始化StreamReader类的实例 |
Encoding中常用的编码格式
- Default:操作系统当前的ANSI代码页的编码
- Unicode:使用 Little-Endian 字节顺序的 UTF-16 格式的编码
- UTF-8:UTF-8 编码
成员属性、成员函数
StreamReader类中常用的属性和方法如下:
属性或方法 | 作用 |
---|---|
Encoding CurrentEncoding | 只读属性,获取当前流中使用的编码方式 |
bool EndOfSteam | 只读属性,获取当前的流位置是否在流结尾 |
void Close() | 关闭流 |
int Peek() | 获取流中的下一个字符的整数,如果没有获取到字符,则返回 -1。 |
int Read() | 获取流中的下一个字符的整数 |
int Read(char[] buffer, int index, int count) | 从指定的索引位置开始将来自当前流的指定的最多字符读进缓冲区 |
string ReadLine() | 从当前流中读取一行字符并将数据作为字符串返回 |
string ReadToEnd() | 读取来自流的当前位置到结果的所有字符 |
代码实例
先获取文件流,在通过文件流构造 StreamReader 来读取文件流,也可以通过路径直接构造 StreamReader 来读取文件流(参考下面写入文件流方式)。
class Program
{
static void Main(string[] args)
{
//文件路径
string filePath = Application.dataPath + "/Data/task.csv";
//按照文件路径打开获取文件流,并获取该文件流的编码格式
FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
//使用文件流相应的字符编码格式来读取文件流
StreamReader streamReader = new StreamReader(fileStream);
//记录每次读取的一行记录
string strLine;
//逐行读取CSV中的数据
while ((strLine = streamReader.ReadLine()) != null)
{
//对数据进行操作
Console.WriteLine(strLine);
}
streamReader.Close();
}
}
StreamWriter类:写入文件
在 C# 语言中,StreamWriter类用于向流中写入字符串。
构造函数
StreamWriter 类的构造方法有很多,常用的构造方法有如下四种:
构造方法 | 说明 |
---|---|
StreamWriter(Stream stream) | 为指定的流创建StreamWriter类的实例 |
StreamWriter(string path) | 为指定路径的文件创建StreamWriter类的实例 |
StreamWriter(Stream stream,Encoding encoding) | 用指定的字符编码为指定的流初始化StreamWriter类的实例 |
StreamWriter(String path, Encoding encoding) | 用指定的字符编码为指定的文件初始化StreamWriter类的实例 |
成员属性、成员函数
StreamWriter类中常用的属性和方法如下:
属性或方法 | 作用 |
---|---|
bool AutoFlush | 属性,获取或设置是否自动刷新缓冲区 |
Encoding Encoding | 只读属性,获取当前流中使用的编码方式 |
void Close() | 关闭流 |
void Flush() | 刷新缓冲区 |
int Write(char value) | 将字符写入流中 |
void WriteLine(char value) | 将字符换行写入流中 |
Task WriteAsync(char value) | 将字符异步写入流中 |
Task WriteLineAsync(char value) | 将字符异步换行写入流中 |
代码实例
直接通过路径直接构造 StreamWriter 来读取文件流,也可以先获取文件流,在通过文件流构造 StreamReader 来读取文件流(参考上面读取文件流方式)。
public void WriteCsv(string strs, string path)
{
if (!File.Exists(path))
{
File.Create(path).Dispose();
}
else
{
File.Delete(path);
File.Create(path).Dispose();
}
string mystr;
//UTF-8方式保存,true表示追加的写入方式,改成false就是直接覆盖写入
using (StreamWriter stream = new StreamWriter(path, true, Encoding.UTF8))
{
for (int i = 0; i < Data.SolList.Count; i++)
{
mystr = "";
Solution sol = Data.SolList[i];
//mystr保存一行数据,不同列的元素之间使用 "," 隔开
mystr = sol.SolutionID.ToString() + "," + sol.MakeSpan.ToString() + "," + sol.WaitTime.ToString() + "," + sol.Balance.ToString() + "," + sol.Category;
stream.WriteLine(mystr);
}
}
}