首页 > 编程语言 >C# FileStream、StreamReader/Writer、MemoryStream

C# FileStream、StreamReader/Writer、MemoryStream

时间:2024-12-06 11:00:16浏览次数:9  
标签:arr fs 字节 C# Writer FileStream Close new

提及文件流,不得不先说以下几个类
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 语句,没写只是为了看着更直观。

End...

标签:arr,fs,字节,C#,Writer,FileStream,Close,new
From: https://www.cnblogs.com/zyg316/p/18590226

相关文章

  • 使用 Vyper 与 Python 结合实现文字识别(OCR)
    Vyper是一种用于编写智能合约的语言,它被设计为Python语言的替代品,旨在提供更简单、安全的代码。然而,Vyper本身并不用于传统的应用程序开发或计算机视觉任务。因此,我们将通过Vyper语言和Python结合,利用Python中的OCR库来实现一个简单的文字识别功能。在本例中,Python......
  • YOLOv8车牌识别系统 深度学习 LPRNet算法 pytorch 大数据 毕业设计(源码)✅
    YOLOv8车牌识别系统深度学习LPRNet算法pytorch大数据毕业设计(源码)✅1、项目介绍技术栈:Python3.8YOLOv8深度学习LPRNet算法pytorch2、项目界面(1)上传图片进行车牌识别(2)上传图片进行车牌识别2(3)多车牌号码进行车牌识别(4)上传视频进行车牌识别实时检测(5)连接......
  • Android studio出现uplicate class kotlin.time.jdk8.DurationConversionsJDK8Kt foun
    Android编译KotlinSDK依赖包类重复冲突问题1、问题问题:gradle同步可以成功,但是编译运行时,出现以下异常。2、分析取以上内容中的一条进行分析可以看到在模块org.jetbrains.kotlin:kotlin-stdlib:1.8.20和org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21中存在重复的......
  • 来学习typescript 吧! --6 联合类型 | 交叉类型 |类型断言
    1、联合类型|<u>联合类型(UnionTypes)表示取值可以为多种类型中的一种。</u>使用|分隔每个类型。letmyFavoriteNumber:string|number;myFavoriteNumber='seven';myFavoriteNumber=7;函数使用联合类型functiongetString(something:string|number):string{re......
  • 使用 Go 语言实现简单的文字识别(OCR)
    随着人工智能技术的迅猛发展,文字识别(OCR,OpticalCharacterRecognition)已经广泛应用于文档扫描、自动化数据输入等领域。在这篇文章中,我们将通过Go语言实现一个简单的文字识别程序,来提取图片中的文字。为了方便操作,我们将使用GoCV库,这是一个基于OpenCV的Go语言绑定,提供了......
  • jQuery和CSS3打造GOOGLE样式的用户登录界面
    这是一款使用Jquery和css3打造的GOOGLE样式的用户登录界面特效。该登录界面特效中,右上角的小问号和错误提示小图标使用SVG来制作,用户名和密码输入框采用浮动标签特效,可点击的按钮上使用了很酷的点击波特效。整个登录界面简洁大方,互动性很强。在线演示 下载 该用户登录界面......
  • git哪个操作会产生commit和将A分支的代码剪切到B分支
    git什么时候会产生commit在Git中,产生commit的操作主要是使用gitcommit命令。分支剪切有些时候,我们在A分支修改后代码,验证后发现没有问题在最后提交的时候发现,分支错误不是A分支,而是B分支这个时候我们不要把分支推送到远端而是切换到B分支,把commit号剪切过去然后切换到A分......
  • codeforces Round 971 div4
    A.Minimize!给你两个整数$$$a$$$和$$$b$$$($$$a\leqb$$$)。在$$$c$$$($$$a\leqc\leqb$$$)的所有可能整数值中,求(c-a)+(b-c)$$$的最小值。题目问(c-a)+(b-c)的最小值,由于c在a到b之间所以只需枚举a到b的每一个数来寻找最小值````#include<iostream>#i......
  • GPU运行模式下(SIMD)—— 为什么在GPU下分支运算的效率极为低下 —— What's up with my
    相关:https://aschrein.github.io/jekyll/update/2019/06/13/whatsup-with-my-branches-on-gpu.html#tldr具体内容参照原文:https://aschrein.github.io/jekyll/update/2019/06/13/whatsup-with-my-branches-on-gpu.html......
  • 基于 easyExcel 3.1.5依赖的包 实现动态表头 动态表格内容
    1.需求:需要导出的EXCEL示例: 2.依赖:<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.5</version></dependency>3.工具类:package......