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#学习七(包含File字节流,list泛型集合、拆装箱、ictionary字典,文件流FileStream、StreamReader和StreamWrite、多态)
一.对前面部份的总结 using System.Collections; using System.IO; using System.Text;namespace _074_复习 {class Pro ...
- C#中数据流(文件流、内存流、网络流等)相关知识点梳理
基本概念 C#中数据流的应用体现在方方面面,现在针其常用的几种类进行一次梳理. 数据流包括文件流(FileStream).内存流(MemoryStream).网络流(NetworkStream)以及读 ...
- ASP.NET中常用的文件上传下载方法
ASP.NET中常用的文件上传下载方法 文件的上传下载是我们在实际项目开发过程中经常需要用到的技术,这里给出几种常见的方法,本文主要内容包括: 1.如何解决文件上传大小的限制 2.以文件形式保存到服务 ...
- 【Unity3D】资源文件 ① ( Unity 中常用的文件类型 | Unity 文件操作 | 文件系统中查看文件 | 添加文件 | 删除文件 | 导入文件 | 复制文件 | 缩略图显示 )
文章目录 一.Unity 中常用的文件类型 二.Unity 文件操作 1.文件系统中查看文件 2.添加目录 / 文件 3.删除目录 / 文件 4.导入资源 5.复制资源 6.缩略图显示 7.meta ...
- java中的常用的文件流_Java 基础(四)| IO 流之使用文件流的正确姿势
image.png 一.什么是 IO 流? 想象一个场景:我们在电脑上编辑文件,可以保存到硬盘上,也可以拷贝到 U 盘中.那这个看似简单的过程,背后其实是数据的传输. 数据的传输,也就是数据的流动.既 ...
- asp。net中常用的文件操作类
** 文件操作类 **/ #region 引用命名空间 using System; using System.Collections.Generic; using System.Text; using ...
- C#中常用的文件操作方法
C#追加文件 StreamWriter sw = File.AppendText(Server.MapPath(".")+"//myText.txt"); sw ...
- C#文件流FileStream的用法
1.简介 FileStream 类:主要用于对文件进行读取.写入.打开和关闭操作,并对其他与文件相关的操作系统句柄进行操作,如管道.标准输入和标准输出.读写操作可以指定为同步或异步操作.FileStr ...
- Linux中常用头文件的作用--转
http://blog.sina.com.cn/s/blog_5c93b2ab0100q62k.html 1. Linux中一些头文件的作用: <assert.h>:ANSI C.提供断言 ...
最新文章
- linux禁止向指定ip发送数据包,Linux下使用iptables封锁端口禁止邮件发送
- 竞赛报名 | AI时代数据库交互怎么玩?首届中文NL2SQL挑战赛开战
- 读写App.config配置文件的方法
- Spring Framework Reference Documentation手册官网下载地址
- string转object对象_025:听闻你精通面向对象,来解决一下
- 王立众:学习多媒体开发从编解码开始
- 翠香猕猴桃 和 薄皮核桃,快来下单
- org.apache.maven.archiver.MavenArchiver.getManifest
- 转载:35岁前成功的12条黄金法则
- 鸿蒙系统定位低端市场,明年年初见!鸿蒙系统会先定位中低端,后续全面升级...
- 如何获取select中的value、text、index相关值 如何获取单选框中radio值 触发事件 radio 默认选中...
- matlab如何换背景图片_紫外特征吸光度/光谱斜率/一阶导数紫外光谱(S275295/S350400/SR)+matlab...
- 卷积自编码器_GCLGP | 图卷积高斯过程
- 2021下半年信息系统项目管理师-综合知识
- asp毕业设计—— 基于asp+access的网上动态同学录系统设计与实现(毕业论文+程序源码)——同学录系统
- IDEA使用有道翻译插件
- kdc服务器密码修改,kdc配置HA · ZHY ZONE
- 乱码问题-Quoted-printable编码
- 在电脑上剪辑视频用什么软件 如何在电脑上剪辑视频
- Java全文搜索怎么弄的_全文搜索 简介