FielSteam和Stream资料汇总

A、C#简单文件读写

读写一个文件对C#来说是非常简单的,通常来讲就包括5个步骤:

1,创建一个文件流。

2,创建阅读器或者写入器。

3,执行读写操作。

4,关闭阅读器,或者写入器。

5,关闭文件流

下面我们就看看这个小列子:

private void brnWrite_Click(object sender, EventArgs e)
        {
            string path = txtFilePath.Text;
            string content = txtContent.Text;
            if (string.IsNullOrEmpty(path) == true)
            {
                MessageBox.Show("请输入文件路径");
                return;
            }
            try
            {
                //创建文件流
                FileStream myFs = new FileStream(path, FileMode.Create);
                //创建写入器
                StreamWriter mySw = new StreamWriter(myFs);
                //将录入的内容写入文件
                mySw.Write(content);
                //关闭写入器
                mySw.Close();
                //关闭文件流
                myFs.Close();
                MessageBox.Show("写入文件成功");

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.ToString());
            }
        }
        //读文件
        private void btnReader_Click(object sender, EventArgs e)
        {
            string path = txtFilePath.Text;
            string content;
            if (string.IsNullOrEmpty(path) == true)
            {
                MessageBox.Show("文件的路径不能为空");
                return;
            }
            try
            {
                //创建文件流
                FileStream myfs = new FileStream(path, FileMode.Open);
                //创建读取器
                StreamReader mySr = new StreamReader(myfs);
                //读取文件所有内容
                content = mySr.ReadToEnd();
                txtContent.Text = content;
                //关闭读取器
                mySr.Close();
                //关闭文件流
                myfs.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.ToString());
            }
        }

 //直接写入方式
                StreamWriter mySw = new StreamWriter(path);
                mySw.Write(content);
                mySw.Close();

 //直接读文件吧
                StreamReader mySr = new StreamReader(path);
                content = mySr.ReadToEnd();
                txtContent.Text = content;
                mySr.Close();  

这样的做和上面的结果没有一点区别,只是我们没有创建文件流。这要注意了:

  不用文件流操作简单,非文件流对文件进行操作,无法对文件的打开方式,访问方式进行精确的控制,不同意控制读写,有的时候会引发异常,但对于这些简单的文件操作而言,是很简单的。

B、

FielStream类操作的是字节和字节数组,而stream类操作的是字符数据。字符数据易于使用,但是有些操作,比如随机文件访问(访问文件中间某点的数据),就必须由FileStream对象执行。    FielStream类维护内部文件指针,该指针指向文件中进行下一次读写操作的位置。    FileStream只能处理原始字节(raw byte),处理原始字节的功能使用FileStream类可以用于处理任何数据文件。    通过读取字节数据,FileStream对像可以用于读取图像和声音。代价是FileStream类不能将数据直接读入字符串    此指针可以修改用Seek方法,它有两个参数:  

  第一个参数:规定文件指针以字节为参数的移动距离   

  第二个参数:规定开始计算的起始位置

byte[] byDataValue = new byte[200];
char[] charDataValue = new char[200]; /// <summary> /// FilesStream读取用法 /// </summary> private void FilesStreamReadFile() { try { FileStream fsFile = new FileStream(@"d:\log.cs", FileMode.Open); //文件指针移到文件的135个字节 fsFile.Seek(135, SeekOrigin.Begin); //将接下来的字节读到Array中 fsFile.Read(byDataValue, 0, 200); } catch (Exception e) { throw e; } //将字节转换成字符 Decoder dc = Encoding.UTF8.GetDecoder(); //字节数组转换成字符数组,便于显示 dc.GetChars(byDataValue, 0, byDataValue.Length, charDataValue, 0); } /// <summary> /// FilesStream写入用法 /// </summary> private void FileStreamWriteFile() { FileStream fsFile = new FileStream(@"D:\log.txt", FileMode.Create); charDataValue="This is test string".ToCharArray(); byDataValue=new byte[charDataValue.Length]; //将字符数组转换成字节数组 Encoder ec=Encoding.UTF8.GetEncoder(); ec.GetBytes(charDataValue,0,charDataValue.Length,byDataValue,0,true); //将指针设定起始位置 fsFile.Seek(0,SeekOrigin.Begin); //写入文件 fsFile.Write(byDataValue,0,byDataValue.Length); }

       FileStream对象通常会在StreamWriter或StreamReader内使用,并使用它们的方法处理文件。    

/// <summary>
        /// StreamWriter写入方法
        /// </summary>
        private void StreamWriterMetod()
        {
            try
            {
                FileStream fsFile = new FileStream(@"d:\log.txt",FileMode.OpenOrCreate);
                StreamWriter swWriter = new StreamWriter(fsFile);
                //写入数据
                swWriter.WriteLine("Hello Wrold.");
                swWriter.WriteLine("It is now {0}", DateTime.Now.ToLongDateString());   
                swWriter.Close();
            }
            catch (Exception e)
            {

                throw e;
            }
        }

        /// <summary>
        /// StreamWriter读取方法
        /// </summary>
        private void StreamReaderMetod()
        {
            string sLine = "";
            try
            {
                FileStream fsFile = new FileStream(@"d:\log.txt", FileMode.Open);
                StreamReader srReader = new StreamReader(fsFile);
                //读取文件(读取大文件时,最好不要用此方法)
                sLine = srReader.ReadToEnd();
                txbValue.Text = sLine;
                srReader.Close();
            }
            catch (Exception e)
            {
                throw e;
            }
        }
        /// <summary>
        /// StreamWriter读取方法2
        /// </summary>
        private void StreamReaderMetodTwo()
        {
            try
            {
                FileStream fsFile = new FileStream(@"d:\log.txt", FileMode.Open);

               
                StreamReader srReader = new StreamReader(fsFile);
                int iChar;
                iChar = srReader.Read();
                while (iChar != -1)
                {
                    txbValue.Text += (Convert.ToChar(iChar));
                    iChar = srReader.Read();
                }
                srReader.Close();
            }
            catch (Exception e)
            {
                throw e;
            }
        }

注:FileMode枚举成员值在文件存在与不存在时的情况

Append 文件存在时:打开文件,流指向文件的末尾,只能与枚举FileAcess.Write联合使用 文件不存在时:创建一个新文件。只能与枚举FileAcess.Write联合使用 Create 文件存在时:删除该文件,然后创建新文件 文件不存在时:创建新文件 CreateNew 文件存在时:抛出异常 文件不存在时:创建新文件 Open 文件存在时:打开现有文件,流指向文件开头 文件不存在时:抛出异常 OpenOrCreate 文件存在时:打开文件,流指向文件开头 文件不存在时:创建新文件 Truhncate 文件存在时:打开现有文件,清除其内容。流指向文件开头,保留文件的初始创建日期。 文件不存在时:抛出异常

 

FileStream-------表示可以被写或被读,或二者都可的文件,此文件可以同步或异步读和写
StreamReader------从流中读取字符数据,并可通过使用FileStream被创建为基类。
StreamWriter------向流写字符数据,可通过使用FileStream被创建为基类。

1. 利用StreamWriter,StreamReader实现对文件的读写:

StreamWriter sw = new StreamWriter("D:\\firsttext.txt", true);
            sw.WriteLine("you ran the StreamWriteDemo program on:");
            sw.WriteLine(DateTime.Now);
            sw.Close();

            StreamReader sr = new StreamReader("D:\\firsttext.txt");
            string strline = null;
            while ((strline = sr.ReadLine()) != null)
            {
                Console.WriteLine(strline);
            }

2. 利用FileStream构造StreamWriter和StreamReader来读写文件

FileStream fs = new FileStream("D:\\firsttext.txt", FileMode.Append);
                StreamWriter sw = new StreamWriter(fs);
                sw.WriteLine("Are you Fightting now?");
                sw.Close(); 

                 FileStream fsread = new FileStream("D:\\firsttext.txt", FileMode.OpenOrCreate, FileAccess.Read);
                StreamReader sr = new StreamReader(fsread);
                while ((strline = sr.ReadLine()) != null)
                {
                    Console.WriteLine(strline);
                }

3. 利用FileStream读写文件

 FileStream fwrite = new FileStream("D:\\stream.txt", FileMode.Append, FileAccess.Write);
            string str = Console.ReadLine();
            byte[] bt = new byte[1000];
            bt = Encoding.ASCII.GetBytes("\n" + str);
            fwrite.Write(bt, 0, str.Length);
            fwrite.Close();

            FileStream fread = new FileStream("D:\\stream.txt", FileMode.OpenOrCreate, FileAccess.Read);
            byte[] btread = new byte[1000];
            fread.Read(btread, 0, 1000);
            string s = Encoding.ASCII.GetString(btread);
            fread.Close();

备注: 

StreamWriter输出中文到出现乱码解决办法:

StreamReader sr = new StreamReader(str, Encoding.GetEncoding("gb2312"));

StreamWriter sw = new StreamWriter("G:\\li.txt",false,Encoding.GetEncoding("gb2312"));

输出中文就没问题了;

 

posted @ 2012-11-19 15:57  江伟  阅读(204)  评论(0)    收藏  举报