最近学习Stream类型,练习打开和保存TXT文件。
首先要明白流概念,学过C++的应该清楚,这里就不多说了【其实我也不知道如何解释】。
Stream类有很多子类,包括:
FileStream类,主要用于读取磁盘上的文件或者向磁盘文件写入信息。有时,我们需要将程序中的一些数据存储到磁盘上或是读取配置文件中某些内容,在这里我们就会用该类。
MemoryStream类,主要用于操作内存中的数据。比如说网络中传输数据时可以用流的形式,当我们收到这些流数据时就可以声明MemoryStream类来存储并且处理它们。
BufferedStream类,主要也是用来处理流数据的,但是该类主要的功能是用来封装其他流类。为什么要封装其他流类,这么做的意义是什么?按照微软的话说主要是减少某些流直接操作存储设备的时间。对于一些流来说直接向磁盘中存储数据这种做法的效率并不高,用BufferedStream包装过的流,先在内存中进行统一的处理再向磁盘中写入数据,也会提高写入的效率。
NetWorkStream类是专门用来处理服务器与客户端通信的流。它在网络编程中经常使用,主要是用来处理类似Socket、TcpClient和TcpListener这些类中得到的流。
以上是转的,转自:
以打开文件为例,首先要弹出对话框,选择要打开的文件。判断对话框返回值是多少,由DialogResult枚举确认,如果是OK表示按下了【打开】按钮。再调用对话框的OpenDialog()方法,输出文件流,再将其作为参数传入到StreamReader中读取,最后调用StreamReader的方法【Read(),ReadLine(),ReadToEnd()】读取出来。最后要关闭StreamReader,不再读取【如果不关闭似乎也没有出错】。上代码吧,这样说比较难以理解。
private void btnOpen_Click(object sender, EventArgs e) { OpenFileDialog dlg = new OpenFileDialog();//定义一个OpenFileDialog对话框,设置一些属性 dlg.Filter = "txt files|*.txt"; dlg.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); string str = String.Empty; if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK) { System.IO.Stream stream = dlg.OpenFile();//输出文件流 StreamReader sr = new StreamReader(stream,Encoding.Default);//定义一个StreamReader,把要读取的流指派给它 str = sr.ReadToEnd();//调用StreamReader的方法读取,此处使用ReadToEnd() sr.Close();//关闭,此时文件的字符已经存在于str中 } tbText.Text = str;//赋值给一个TextBox,显示出来 }
接下来是保存文件,与打开文件相似,只不过是换成了SaveFileDialog(),StreamWriter。注意最后一定要关闭StreamWriter,否则文件尚未保存。如果没有关闭,保存后打开,发现里面一片空白。
private void btnSave_Click(object sender, EventArgs e) { SaveFileDialog dlg = new SaveFileDialog();//定义一个SaveFileDialog对话框,设置一些属性 dlg.Filter = "txt file|*.txt"; dlg.DefaultExt = "txt"; dlg.AddExtension = true; if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK) { System.IO.Stream stream = dlg.OpenFile();//输出文件流 StreamWriter sw = new StreamWriter(stream);//定义一个StreamReader,把要读取的流指派给它 sw.Write(tbText.Text);//调用StreamWriter的方法读取,此处使用Write() sw.Close();//一定要关闭StreamWriter!! } }
接下来说一说TextReader,StreamReader,StringReader的区别。
TextReader是抽象类,不能实例化。StreamReader和StringReader是它的子类,两者的区别从名字上就一目了然。
此外,回车在不同的系统中有不同的字符对应。Linux/Unix系统里,每行结尾只有“\n”;Windows系统里面,每行结尾是“\r\n”;Mac系统里,每行结尾是"\r"。可以在运行代码的时候设置断点查看。
简单的方法就是这样,以后要学习如何打开Word,Excel文件。