文章目录

一: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)相关推荐

  1. C#学习七(包含File字节流,list泛型集合、拆装箱、ictionary字典,文件流FileStream、StreamReader和StreamWrite、多态)

    一.对前面部份的总结 using System.Collections; using System.IO; using System.Text;namespace _074_复习 {class Pro ...

  2. C#中数据流(文件流、内存流、网络流等)相关知识点梳理

    基本概念 C#中数据流的应用体现在方方面面,现在针其常用的几种类进行一次梳理. 数据流包括文件流(FileStream).内存流(MemoryStream).网络流(NetworkStream)以及读 ...

  3. ASP.NET中常用的文件上传下载方法

    ASP.NET中常用的文件上传下载方法 文件的上传下载是我们在实际项目开发过程中经常需要用到的技术,这里给出几种常见的方法,本文主要内容包括: 1.如何解决文件上传大小的限制 2.以文件形式保存到服务 ...

  4. 【Unity3D】资源文件 ① ( Unity 中常用的文件类型 | Unity 文件操作 | 文件系统中查看文件 | 添加文件 | 删除文件 | 导入文件 | 复制文件 | 缩略图显示 )

    文章目录 一.Unity 中常用的文件类型 二.Unity 文件操作 1.文件系统中查看文件 2.添加目录 / 文件 3.删除目录 / 文件 4.导入资源 5.复制资源 6.缩略图显示 7.meta ...

  5. java中的常用的文件流_Java 基础(四)| IO 流之使用文件流的正确姿势

    image.png 一.什么是 IO 流? 想象一个场景:我们在电脑上编辑文件,可以保存到硬盘上,也可以拷贝到 U 盘中.那这个看似简单的过程,背后其实是数据的传输. 数据的传输,也就是数据的流动.既 ...

  6. asp。net中常用的文件操作类

    ** 文件操作类 **/ #region 引用命名空间 using System; using System.Collections.Generic; using System.Text; using ...

  7. C#中常用的文件操作方法

    C#追加文件 StreamWriter sw = File.AppendText(Server.MapPath(".")+"//myText.txt"); sw ...

  8. C#文件流FileStream的用法

    1.简介 FileStream 类:主要用于对文件进行读取.写入.打开和关闭操作,并对其他与文件相关的操作系统句柄进行操作,如管道.标准输入和标准输出.读写操作可以指定为同步或异步操作.FileStr ...

  9. Linux中常用头文件的作用--转

    http://blog.sina.com.cn/s/blog_5c93b2ab0100q62k.html 1. Linux中一些头文件的作用: <assert.h>:ANSI C.提供断言 ...

最新文章

  1. linux禁止向指定ip发送数据包,Linux下使用iptables封锁端口禁止邮件发送
  2. 竞赛报名 | AI时代数据库交互怎么玩?首届中文NL2SQL挑战赛开战
  3. 读写App.config配置文件的方法
  4. Spring Framework Reference Documentation手册官网下载地址
  5. string转object对象_025:听闻你精通面向对象,来解决一下
  6. 王立众:学习多媒体开发从编解码开始
  7. 翠香猕猴桃 和 薄皮核桃,快来下单
  8. org.apache.maven.archiver.MavenArchiver.getManifest
  9. 转载:35岁前成功的12条黄金法则
  10. 鸿蒙系统定位低端市场,明年年初见!鸿蒙系统会先定位中低端,后续全面升级...
  11. 如何获取select中的value、text、index相关值 如何获取单选框中radio值 触发事件 radio 默认选中...
  12. matlab如何换背景图片_紫外特征吸光度/光谱斜率/一阶导数紫外光谱(S275295/S350400/SR)+matlab...
  13. 卷积自编码器_GCLGP | 图卷积高斯过程
  14. 2021下半年信息系统项目管理师-综合知识
  15. asp毕业设计—— 基于asp+access的网上动态同学录系统设计与实现(毕业论文+程序源码)——同学录系统
  16. IDEA使用有道翻译插件
  17. kdc服务器密码修改,kdc配置HA · ZHY ZONE
  18. 乱码问题-Quoted-printable编码
  19. 在电脑上剪辑视频用什么软件 如何在电脑上剪辑视频
  20. Java全文搜索怎么弄的_全文搜索 简介

热门文章

  1. 论文阅读(3)-基于改进的U-Net的皮肤病变分割
  2. Clonezilla live 再生龙还原系统
  3. 如何成为月入五万的程序员,他们告诉你!
  4. const mutable
  5. 使用 mybatis 自定义日期类型转换器
  6. Defects4J安装问题记录
  7. 苹果CMS Mxone Pro开源版无加密v7.2
  8. Java 位运算符详解
  9. e生保等待期什么意思_关于e生保等待期的那些小秘密!你一定要知道!
  10. 创梦天地关嵩:借力腾讯云,打造文娱新生态——云+未来峰会回顾