大佬教程收集整理的这篇文章主要介绍了C# 中常用的文件流(FileStream、StreamReader/Writer、MemoryStream),大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
文章目录一:FileStream类二:StreamReader/StreamWriter类三:TextReader/TextWriter类四:MemoryStream类五:NetWorkStream类六:IO 代码优化(using自动释放资源)
提及文件流,不得不先说以下几个类FileStream,MemoryStream,NetWorkStream,StreamReader,StreamWriter,TextReader,TextWriter在用这些类之前,我们先来了解一下这些类的用途以及区别。先声明一个路径:String path = “D:/Stream/IO.txt”;
一:FileStream类用途:主要用于对磁盘上文件的读写,常用于向磁盘存储数据或读取配置文件。优点:该类维护内部文件指针,当处理大型文件时非常省时,因为马上可以定位到正确的位置。缺点:该类是通过字节形式来读写数据的,需要自己处理编码转换,把字节数据转换为文本。如何使用(FileStream现有15个构造函数)
读取数据:
FileStream fs = new FileStream(path,FileMode.open); //初始化文件流 byte[] arr = new byte[fs.Length]; //初始化字节数组 fs.Read(arr, 0, arr.Length); //从流中数据读取到字节数组中 fs.Close(); //关闭流 String str = Encoding.UTF8.GetString(arr); //将字节数组转换为字符串 Console.WriteLine(str);
写入数据:
FileStream fs = new FileStream(path,FileMode.Append); //初始化文件流 byte[] arr = Encoding.UTF8.GetBytes("程序人生道可道"); //将字符串转换为字节数组 fs.Write(arr,0,arr.Length); //将字节数组写入文件流 fs.Close();
二:StreamReader/StreamWriter类用途:主要用来处理流数据,它们分别提供了高效的流读取/写入功能。优点:可以直接用字符串进行读写,而不用转换成字节数组。注意:对于文本文件的读写,通常用 StreamReader 类和 StreamWriter 类更方便,其底层是通过FileStream实现读写文本文件。
读取数据:
FileStream fs = new FileStream(path,FileMode.open); //初始化文件流 StreamReader sr = new StreamReader(fs); //初始化StreamReader String line = sr.ReadLine(); //直接读取一行 String line = sr.ReadToEnd() //读取全文 sr.Close(); //关闭流 fs.Close(); //关闭流 Console.WriteLine(linE);
经试验:读取数据时 sr 和 fs 关闭的顺序颠倒同样可以读取到数据,考虑代码规范,常规写法就行。
写入数据:
FileStream fs = new FileStream(path,FileMode.Append); //初始化文件流 StreamWriter sw = new StreamWriter(fs); //初始化StreamWriter sw.WriteLine("程序人生道可道"); //写入一行数据 sw.Close(); //关闭流 fs.Close(); //关闭流
经试验:写入数据时 fs 一定要在 sw 后面关闭,否则会抛出异常(因为你在写入数据之前,你已经把文件流给关闭了,肯定写不进去数据了)
三:TextReader/TextWriter类用途:主要用来处理流数据,它们分别提供了高效的流读取/写入功能。TextReader,TextWriter类分别是StreamReader,StreamWriter的父类,像子类的 Read() 等方法其实都是重写了父类的方法。
读取数据:
TextReader tr = File.opentext(path); //读取路径 String str = tr.ReadLine(); //读取一行数据 Console.WriteLine(str);
写入数据:
FileStream fs = new FileStream(path, FileMode.Append); //初始化文件流 TextWriter sw = new StreamWriter(fs); //子类是父类 sw.WriteLine("2019年3月1日17:51:09"); //写入一行数据 sw.Close(); //关闭流 fs.Close();
四:MemoryStream类用途:内存流类,主要用于操作内存中的数据。比如说网络中传输数据时可以用流的形式,当我们收到这些流数据时就可以声明 MemoryStream 类来存储并且处理它们。
String str = "你好,客户端"; byte[] arr = Encoding.UTF8.GetBytes(str); //将字符串转换为字节数组 MemoryStream ms=new MemoryStream(arr); //初始化MemoryStream类 byte[] arrNew = ms.ToArray(); //将内存中的数据转换为字节数组 String strNew = Encoding.UTF8.GetString(arrNew); //将字节数组转换为字符串 Console.WriteLine(strNew);
五:NetWorkStream类用途:网络流类,专门用来处理服务器与客户端通信的流。它在网络编程中经常使用,主要是用来处理类似Socket、TcpClient和TcpListener这些类中得到的流。
服务器:
TcpListener lis = new TcpListener(5000); //服务器监听 lis.Start(); //启动 Socket socket = lis.AcceptSocket(); //阻塞,直到有客户端连接 NetworkStream netStream = new NetworkStream(socket); //得到Socket中的流 if (netStream.DataAvailablE) //如果客户端发送了消息 { byte[] data = new byte[1024]; //定义一个字节数组,用来存放接收的数据 int len = netStream.Read(data, 0, data.Length); //从开始位置,读取到字节数组末尾 String line = Encoding.Default.GetString(data, 0, len); //把收到的字节转换为字符串 } netStream.Flush(); //刷新流中的数据 netStream.Close(); //关闭流
客户端:
TcpClient client = new TcpClient(); //客户端tcp对象 client.Connect("127.0.0.1", 5000); //连接服务器 NetworkStream myStream = client.GetStream(); //得到网络流 byte[] data = Encoding.Default.GetBytes("你好"); //首先把输入的字符串消息转换为字节 myStream.Write(data, 0, data.Length); //向 myStream 里写入数据 myStream.Flush(); //刷新流中的数据 myStream.Close(); //关闭流
六:IO 代码优化(using自动释放资源)拿前面说的第一个类 FileStream 的读取文件代码为例,我们先来看看优化后的代码是怎样的
//使用using语句初始化文件流 using (FileStream fs = new FileStream(path, FileMode.open)) { byte[] arr = new byte[fs.Length]; //初始化字节数组 fs.Read(arr, 0, arr.Length); //从流中数据读取到字节数组中 fs.Close(); //关闭流 String str = Encoding.UTF8.GetString(arr); //将字节数组转换为字符串 Console.WriteLine(str); }
对比后,我们发现,差异只是在初始化文件流的时候用到了 using 语句。在 using 语句内实例化的,会在 using 语句结束时自动 Dispose(销毁)掉,这样系统资源就会得到很好的释放。像文件的读写,数据库的连接这些比较占用系统资源的操作,尽量都使用 using 语句。前面的代码也应该加上 using 语句,没写只是为了看着更直观。
以上是大佬教程为你收集整理的C# 中常用的文件流(FileStream、StreamReader/Writer、MemoryStream)全部内容,希望文章能够帮你解决C# 中常用的文件流(FileStream、StreamReader/Writer、MemoryStream)所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。