C#读取文件流

来源:互联网 发布:淘宝双十一下载 编辑:程序博客网 时间:2024/06/05 09:45

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace _18记事本
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }


        private void 新建NToolStripMenuItem_Click(object sender, EventArgs e)
        {
            txtText.Text = "";//清空控件的文本即为新建
        }

        private void 打开OToolStripMenuItem_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();//这里不采取拖控件的方式,在代码中实例化一个对话框控件类
            //记住:做一天测试一点,然后边测试边思考下一步的思路

            ofd.Title = "打开文件"; //为打开的对话框添加标题
            ofd.Filter = "文本文件|*.txt|所有文件|*.*";//添加过滤器


            //下一步,要把对话框显示出来
            if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)//当打开文件的时候,注意:这个时候后面的代码应该是DialogResult.OK,而不是什么打开啊,确定取消什么的
            {
                //点击了对话框的”打开“按钮,这时候才要读入文件
                //第一步:声明一个文件流
                FileStream fs = new FileStream(ofd.FileName, FileMode.Open, FileAccess.Read, FileShare.Read);
                //第二个参数和第三个参数是配对使用的,当第二参数为创建create的时候,则第三个参数后面的枚举类型应选择为写入write.

 

                //第二步:创建读写器
                StreamReader sr = new StreamReader(fs,Encoding.Default);//采用的是方法的第一个重载方法,参数是一个流。因为子类可以默认转换为父类,所以参数可以使文件流,网络流,数据流或序列化以后的流等等。

                ////第一种方式,使用sr.ReadLine的方式单行读取
                //while (sr.EndOfStream==true)//当一读到末尾的时候,则进行如下的逻辑
                //{
                //    string line=sr.ReadLine();//读取一行,用一个字符串变量line来保存读取到的内容
                //    txtText.Text = txtText.Text + line + "\r\n";//当前text控件的text的属性拼接读取到的每行的内容,然后在每一行的末尾添加上一个回车符号;这个写法让我想起来去微软面试的那个两层循环的倒序字符串的算法题目
                //}                                               //记住,始终要有这种思想,计算机仅仅只是执行你的思路所写出来的代码,计算机没有任何思维,在写代码的时候就把你自己想象成计算机你要解决这个问题的话你的思路是什么?
                                                                  //你会怎么来执行你所遇到的那个问题,然后用你所熟悉的代码表达出来就可以了。和你写诗歌是一样的,根据一个意境,抽象成一个字,一个词,一句话,越精简越通俗越好越精妙
               


                //第二种方式:使用直接读取到流末尾的方式
                txtText.Text = sr.ReadToEnd();//读取到最后


                sr.Close();//关闭读取器
                fs.Close();//关闭文件流
            }


        }

 


        //编写保存功能
        private void 保存SToolStripMenuItem_Click(object sender, EventArgs e)
        {
            SaveFileDialog sfd = new SaveFileDialog();//得到一个保存文件对话框
            sfd.Title = "保存文件"; //为保存对话框设置标题
            sfd.Filter = "文本文件|*.txt|所有文件|*.*";//设置过滤器

            if (sfd.ShowDialog()== System.Windows.Forms.DialogResult.OK)//如果选中的保存的按钮的时候
            {
                //下面的思路是开始保存文本文件

                //声明一个流对象


                using (FileStream fs = new FileStream(sfd.FileName, FileMode.Create))
                {
                    //得到一个用来沟通文件和写入器的一个文件流对象,使用构造函数进行初始化,
                    //用户选择的文件路径放在保存对话框对象sfd的FileName属性里面

                    StreamWriter sw = new StreamWriter(fs, Encoding.Default);//声明一个写入器
                    sw.Write(txtText.Text);//使用流对象的Write方法将内容写入到textbox对象的text属性中去,这句代码的真实意思是把内容首先写入到fs文件流对象中
                    //去,当被创建的缓存区被填充满以后然后一口气写入到文本文件中去,而不是写一点内容就直接写入到文本中去。中间的那块内存区其实相当于一个缓冲区
                    //这么做的目的是为了提高写入的效率。


                    sw.Close();//关闭写入器
                    fs.Close();//关闭流对象

                    //如果忘记关闭的话,则会造成写入不完全或者数据丢失。如果每次往磁盘中写数据都会引起磁盘的转动,磁盘就去对应的位置寻找文件的内容然后向
                    //磁盘中写入,这样总是不停地进行磁盘寻址必然会造成效率的低下,所以引入了文件流的概念。这也是asp.net网站中发生缓存而不能及时显示出来
                    //效果或数据的原因。       因为流的操作是把数据暂时放在内存的一段缓存里面,而不是每次传多少就写多少,当缓存区内的数据满的时候才一下子
                    //写入到文本中去的。经过试验,使用和不使用using关键字和关闭不关闭流对象是没有关系的。使用using关键字为是了即使释放非托管代码的。

                }
                MessageBox.Show("保存成功");//给出一个提示,在函数内部根据具体逻辑的需要放在适当的位置给出提示,以让用户有清晰的了解操作的进度

            }
          
        }
    }
}