c# FileStream、StreamReader/Writer、MemoryStream
提及文件流,不得不先说以下几个类
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)
文章目录 一:FileStream类 二:StreamReader/StreamWriter类 三:TextReader/TextWriter类 四:MemoryStream类 五:NetWorkSt ...
- 写作软件评测iA Writer、Ulysses、Effie、Typora、Writeathon、Bear
写作软件综合评测:iA Writer.Ulysses.Effie.Typora.Scrivener.Gingko Writer.Writeathon.Bear.FlowUs iA Writer 介绍 ...
- c# - FileStream、StreamReader、StreamWriter
先看下File和FileStream的区别: File在读取文件时,是一下子全部读取出来: FileStream在读取文件时,是一点一点的读取的,对于内存来说,压力更小一些: FileSteam 读取 ...
- C#学习七(包含File字节流,list泛型集合、拆装箱、ictionary字典,文件流FileStream、StreamReader和StreamWrite、多态)
一.对前面部份的总结 using System.Collections; using System.IO; using System.Text;namespace _074_复习 {class Pro ...
- C# 第七章『I/O数据流』◆第5节:数据流—StreamWriter类、StreamReader类
FileStream类的对象只能以字节的形式读取/写入数据,这就使操作变得非常困难,所以需要借用StreamWriter对象或StreamReader对象的方法来处理文件. 一.StreamWrite ...
- springbatch的writer、processor、reader复杂太难用?使用tasklet更方便!
writer.processor.reader复杂太难用,使用mybatis太复杂,操作数据库太复杂,一不小心还会配置出错. 使用tasklet更加方便! @Component public clas ...
- C#数据流:文件流、内存流、网络流
全栈工程师开发手册 (作者:栾鹏) c#教程全解 C#编程中数据流的使用一直不很熟练,没有一个系统的认识,但是它的重要性显然不言而喻.System.IO下的Stream类是所有数据流的基类,当我们对数 ...
- C#中数据流(文件流、内存流、网络流等)相关知识点梳理
基本概念 C#中数据流的应用体现在方方面面,现在针其常用的几种类进行一次梳理. 数据流包括文件流(FileStream).内存流(MemoryStream).网络流(NetworkStream)以及读 ...
- 【Audio】Unity音频模块:加载、转换、剪切、混音、合并
GitHub项目:Epitome.Audio音频模块 WWW类外部加载音乐文件 使用delegate委托:音频加载完成进行回调 namespace Epitome {public delegate v ...
最新文章
- 一些很基本的小知识点,这篇作为持续更新用的
- github创建项目,并提交本地文件
- 监听Activity的生命周期的方式。
- 第七章-NoSQL数据库
- 开发DBA(APPLICATION DBA)的重要性
- iOS中XML解析汇总
- 最常用的设计模式---适配器模式(C++实现)
- js 保留两位小数(四舍五入)
- 阿里小二平时和商家交流的时候,明确告知流量喜欢什么样的产品?
- Javascript获取For循环所用时间
- 兄弟姐妹们,祝大家圣诞节快乐!
- javascript 函数定义的方式
- 图邻接表拓扑排序算法c语言完整,在用邻接表表示图时,拓扑排序算法时间复杂度为()...
- 同时合并多个视频,并添加转场特效
- 虚拟机中计算机内存不够,win7系统VMware虚拟机电脑安装系统提示虚拟内存不足的解决方法...
- C#锐利体验 第十六讲 映射
- 数据结构作业——Sanji(优先队列)
- vcruntime140.dll不可用或缺少
- 【Hadoop】谷歌的三篇论文(GFS、MapReduce分布式计算模型 、BigTable大表)
- ConcurrentHashMap 是如何保证线程安全的,你知道么?
热门文章
- 2022-2028全球与中国汽车可再生材料市场现状及未来发展趋势
- 奔腾系列的CPU 和酷睿系列的CPU
- 加速度传感器采集的加速度值有没有必要转换为位移量
- Win10如何隐藏或显示指定的WiFi SSID
- 父亲母亲-给母亲唱一首歌
- linux脚本无法执行命令,为什么Shell脚本执行不成功?原来是这样
- JavaScript本地储存:localStorage、sessionStorage、cookie
- 递归树以及循环树算法
- [小样本医学图像]‘Squeeze Excite’ Guided Few-Shot Segmentation of Volumetric Images
- Vulnhub系列--Vulnscan