数据读写:C#实现文件数据读写

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中常用的编码格式
  1. Default:操作系统当前的ANSI代码页的编码
  2. Unicode:使用 Little-Endian 字节顺序的 UTF-16 格式的编码
  3. 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);
            }
        }
    }
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值