天天看点

c# FileStream、StreamWriter、StreamReader的使用

FileMode Enum

指定操作系统打开文件的方式。

字段 说明
Append 打开文件,如果不存在则创建一个新文件。
Create 创建新文件,如果文件已存在,则被覆盖。
CreateNew 创建新文件,如果文件已存在,引发IOException异常。
Open 打开文件,如果不存在,引发FileNotFoundException异常。
OpenOrCreate 打开文件(已存在),如果不存在则创建一个新文件。
Truncate 打开文件并清空内容,如果不存在,引发异常。

FileAccess Enum

定义文件的读取、写入或读/写访问权限的常量。

字段 说明
Read 对文件读取访问。可从文件读取数据。
ReadWrite 对文件的读写访问权限。可以从文件读取数据和将数据写入文件
Write 文件的写访问。可将数据写入文件

FileShare Enum

包含用于控制其他 FileStream 对象对同一文件可以具有的访问类型的常数。

字段 说明
Delete 允许随后删除文件。
Inheritable 使文件句柄可由子进程继承。 Win32 不直接支持此功能
None 谢绝共享当前文件。 文件关闭前,打开该文件的任何请求(由此进程或另一进程发出的请求)都将失败。
Read 允许随后打开文件读取。 如果未指定此标志,则文件关闭前,任何打开该文件以进行读取的请求(由此进程或另一进程发出的请求)都将失败。 但是,即使指定了此标志,仍可能需要附加权限才能够访问该文件。
ReadWrite 允许随后打开文件读取或写入。 如果未指定此标志,则文件关闭前,任何打开该文件以进行读取或写入的请求(由此进程或另一进程发出)都将失败。但是,即使指定了此标志,仍可能需要附加权限才能够访问该文件。
Write 允许随后打开文件写入。 如果未指定此标志,则文件关闭前,任何打开该文件以进行写入的请求(由此进程或另一进过程发出的请求)都将失败。 但是,即使指定了此标志,仍可能需要附加权限才能够访问该文件。

FileStream

为文件提供 Stream,既支持同步读写操作,也支持异步读写操作。

//打开并读取文本
        private void ReadTXT()
        {
            string txtUrl = AppDomain.CurrentDomain.BaseDirectory + "MyTest.txt";
            using (FileStream fs = new FileStream(txtUrl, FileMode.Open))
            {
                int len = (int)fs.Length;//流长度(字节为单位)
                byte[] buffer = new byte[len];
                int n = fs.Read(buffer, 0, len);//从流中读取字节块并将该数据写入给定缓冲区中。
                string str = Encoding.Default.GetString(buffer);

                Console.WriteLine(str);
            }
        }

        //打开并写入数据
        private void WriteTXT()
        {
            string txtUrl = AppDomain.CurrentDomain.BaseDirectory + "MyTest.txt";
            using (FileStream fs = new FileStream(txtUrl, FileMode.Open))
            {
                string str = "你好";
                byte[] buffer = Encoding.Default.GetBytes(str);
                fs.Write(buffer,0,buffer.Length);//从起始位置0位置,写入数据,原先0位置的数据会被替换掉
            }
        }
           

StreamReader

实现一个 TextReader,使其以一种特定的编码从字节流中读取字符。

//读取文本
        private void ReadTXT_StreamReader()
        {
            string txtUrl = AppDomain.CurrentDomain.BaseDirectory + "MyTest.txt";
            //using (StreamReader sr = new StreamReader(txtUrl))//不指定编码
            using (StreamReader sr = new StreamReader(txtUrl,Encoding.UTF8))//指定编码
            {
                string str = "";
                string line = sr.ReadLine();
                while(line != null)
                {
                    str += line;
                    line = sr.ReadLine();
                }

                Console.WriteLine(str);
            }
        }
           

StreamWriter

实现一个 TextWriter,使其以一种特定的编码向流中写入字符。

//写入数据
        private void WriteTXT_StreamWriter()
        {
            string txtUrl = AppDomain.CurrentDomain.BaseDirectory + "MyTest.txt";
            //using (StreamWriter sw = new StreamWriter(txtUrl))//如果文件存在,则会清空原先内容
            using (StreamWriter sw = new StreamWriter(txtUrl,true))//第二个参数,true 如果文件存在数据追加到该文件中
            {
                sw.WriteLine("Hello 你好吗?");//写入数据
            }
        }
           

FileStream 和 StreamReader 结合使用

//打开并读取文本
        private void ReadTXT_FileStream_StreamReader()
        {
            string txtUrl = AppDomain.CurrentDomain.BaseDirectory + "MyTest.txt";
            using (FileStream fs = new FileStream(txtUrl, FileMode.Open))
            {
                StreamReader sr = new StreamReader(fs);//要读取的流。
                string strTxt = "";
                string strLine = sr.ReadLine();
                while (strLine != null)
                {
                    strTxt += strLine;
                    strLine = sr.ReadLine();
                }
                sr.Close();//手动关闭

                Console.WriteLine(strTxt);
            }
        }
           

FileStream 和 StreamWriter结合使用

//写入数据
        private void WriteTXT_FileStream_StreamWriter()
        {
            string txtUrl = AppDomain.CurrentDomain.BaseDirectory + "MyTest.txt";
            using (FileStream fs = new FileStream(txtUrl, FileMode.Open))//此方式结合StreamWriter 每次写入都是从起始位置,并且会顶替原先位置内容
            //using (FileStream fs = new FileStream(txtUrl, FileMode.Append))//此方式结合StreamWriter 会从内容末尾追加新写入的内容
            {
                StreamWriter sw = new StreamWriter(fs,Encoding.UTF8);
                sw.WriteLine("嘿嘿嘿");
                sw.Close();
            }
        }
           

注解:

实现了IDisposable接口。使用完类型后,您应该直接或间接释放类型。若要直接释放类型,调用Dispose中的方法try/catch块。若要间接释放类型,请使用using语法。