首页 > 编程语言 >C# 中的Stream流

C# 中的Stream流

时间:2024-10-29 10:51:32浏览次数:5  
标签:fs string Stream C# Write ms new byte

C# 中的Stream流

 

流就是一个类的对象,很多文件的输入输出操作都以类的成员函数的方式来提供;

流其实是一种信息的转换,是有序的,有输入和输出流(IO);

1.FileStream

文件流,读取和保存文件操作使用;

//写入
FileStream fs = new FileStream("data.txt", FileMode.OpenOrCreate);
string msg = "littlePerilla";
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(msg);
fs.Write(bytes, 0, bytes.Length);
fs.Flush();
fs.Close();

//读取
FileStream fs = new FileStream("data.txt", FileMode.Open, FileAccess.Read);
byte[] bytes = new byte[fs.Length];
fs.Read(bytes, 0, bytes.Length);
char[] c = Encoding.UTF8.GetChars(bytes);
fs.Flush();
fs.Close();

2.StreamReader 和 StreamWriter

粒度为字符的流;

void StreamWrite()
{
	string path = "test.txt";
	//创建StreamWriter 类的实例
	StreamWriter streamWriter = new StreamWriter(path);
	streamWriter.WriteLine("Perilla");
	streamWriter.WriteLine("13112345678");
	//刷新缓存
	streamWriter.Flush();
	//关闭流
	streamWriter.Close();
}

void StreamReader()
{
	//定义文件路径
	string path = "test.txt";
	//创建 StreamReader 类的实例
	StreamReader streamReader = new StreamReader(path);
	//判断文件中是否有字符
	while (streamReader.Peek() != -1)
	{
		//读取文件中的一行字符
		string str = streamReader.ReadLine();
		Debug.Log(str);
	}
	streamReader.Close();
}

3.BinaryWriter 和 BinaryReader

粒度为字节的读写流;

// 读取文件
void ReadFile()          
{
	FileStream fs = new FileStream("data.txt", FileMode.Open, FileAccess.Read);
	BinaryReader r = new BinaryReader(fs);

	//以二进制方式读取文件中的内容
	int i = r.ReadInt32();
	float f = r.ReadSingle();
	double d = r.ReadDouble();
	bool b = r.ReadBoolean();
	string s = r.ReadString();
	Debug.Log(i);
	Debug.Log(f);
	Debug.Log(d);
	Debug.Log(b);
	Debug.Log(s);

	r.Close();
	fs.Close();
}

// 写入文件
void WriteFile()    
{
	FileStream fs = new FileStream("data.txt", FileMode.OpenOrCreate);
	BinaryWriter w = new BinaryWriter(fs);

	//以二进制方式向创建的文件中写入内容 
	w.Write(1123);                
	w.Write(0.3135f);             
	w.Write(0.3188946);           
	w.Write(true);                
	w.Write("LittlePerilla");     

	w.Close();
	fs.Close();
}

4.MemoryStream

内存的读写流,字节粒度,支持Position和Seek操作,自由度更高;

支持异步读写,不需要手动释放和开辟内存;

支持在任意位置修改操作;

class Program
{
    static void Main(string[] args)
    {
        string strValue = "LittlePerillaIsSuperHero";
        MemoryStream ms = new MemoryStream();
        ms.Write(Encoding.UTF8.GetBytes(strValue), 0, strValue.Length);

        Console.WriteLine(ms.Position);
        //打印测试
        byte[] byte1 = ms.GetBuffer();          
        string str1 = Encoding.UTF8.GetString(byte1);
        Console.WriteLine(str1);


        ms.Seek(2, SeekOrigin.Current);
        ms.ReadByte();
        ms.ReadByte();
        ms.ReadByte();
        ms.ReadByte();                    
        byte[] bytes3 = ms.ToArray();
        foreach (byte b in bytes3)
        {
            Console.Write(b + "-");
        }
        str1 = Encoding.UTF8.GetString(bytes3);
        Console.WriteLine("\n"+str1);
        //这里说明ms.ReadByte不会截断读完的数据

        MemoryStream ms2 = new MemoryStream();
        byte[] bytes6 = Encoding.UTF8.GetBytes("abcde");
        ms2.Write(bytes6, 0, bytes6.Length);
        Console.WriteLine(ms2.Position);
		
        //等价
        ms2.Position = 0;//ms2.Seek(0, SeekOrigin.Begin);  

        byte[] byteArray = new byte[5] { 110, 110, 110, 110, 110 };
        ms2.Read(byteArray, 2, 1);
        Console.WriteLine(Encoding.UTF8.GetString(byteArray));
        //结果为nnann,说明讲ms2中的数据读进byteArray中偏移2的位置,且只读取1个字节;

        //指定位置写入
        MemoryStream ms3 = new MemoryStream();
        byte[] bytesArr = Encoding.ASCII.GetBytes("abcdefg");
        ms3.Write(bytesArr, 0, bytesArr.Length);
        ms3.Position = 2;
        ms3.WriteByte(97);  //97代表的是a   这段代码的意思是,将原先第二个的c替换为a
        string str = Encoding.ASCII.GetString(ms3.ToArray());
        Console.WriteLine(str); //输出 abacdefg

        Console.ReadKey();
    }

}

5.NetworkStream

为网络访问提供数据的基础流;用于 Stream 在阻止模式下通过套接字发送和接收数据的方法;

可以将类用于 NetworkStream 同步和异步数据传输;

创建NetworkStream必须提供Socket

详细不适合在这里讨论;待完善吧;

标签:fs,string,Stream,C#,Write,ms,new,byte
From: https://www.cnblogs.com/sexintercourse/p/18512462

相关文章

  • SpringBoot汽车销售管理系统1cv5c 程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表系统内容:销售员,客户,销售订单,品牌,车系,汽车库存,汽车入库,财务报表开题报告内容一、研究背景随着汽车市场的不断扩大和竞争的日益激烈,汽车销售管理系统的需......
  • centos9(linux): 在prometheus服务端添加被监控节点
    一,从服务端所在机器测试被监控节点是否9100端口打开1,用telnet$telnet172.16.13.191002,用nc$nc-nvv172.16.13.19100 二,在服务端prometheus中添加一个监控节点编辑配置文件:viprometheus.yml内容:在static_configs: 下增加一行:-targets:["172.16.13.......
  • Autofac 解释第一个例子 《第一篇》
    Autofac解释第一个例子《第一篇》 Autofac是一个轻量级的依赖注入的框架,同类型的框架还有Spring.NET,Unity,Castle等。Autofac的使用有一个非常让人郁闷的地方,就是服务器要求安装有Microsoft.NETFramework4KB2468871。该补丁的地址是:http://www.microsoft.com/zh-cn......
  • Performance API 实现前端资源监控
    1.PerformanceAPI的用处PerformanceAPI 是浏览器中内置的一组工具,用于测量和记录页面加载和执行过程中的各类性能指标。它的主要用处包括:监控页面资源加载:跟踪页面中的资源(如CSS、JavaScript、图片)的加载时间。分析页面加载时间:从导航到页面完全渲染的所有时间点。衡量......
  • Autofac 组件、服务、自动装配 《第二篇》
    Autofac组件、服务、自动装配《第二篇》 一、组件创建出来的对象需要从组件中来获取,组件的创建有如下4种(延续第一篇的Demo,仅仅变动所贴出的代码)方式:1、类型创建RegisterTypeAutoFac能够通过反射检查一个类型,选择一个合适的构造函数,创造这个对象的实例。......
  • 通过配置的方式Autofac 《第三篇》
    通过配置的方式Autofac《第三篇》 一、基本配置1、通过配置的方式使用Autofac<?xmlversion="1.0"?><configuration><configSections><sectionname="autofac"type="Autofac.Configuration.SectionHandler,Autofac.Configur......
  • AutoFac IoC DI 依赖注入
    AutoFacIoCDI依赖注入 AutoFacIoCDI依赖注入记录点点滴滴知识,为了更好的服务后来者!一、为什么使用AutoFac?之前介绍了Unity和Ninject两个IOC容器,但是发现园子里用AutoFac的貌似更为普遍,于是捯饬了两天,发现这个东东确实是个高大上的IOC容器~Autofac是.NET领域最为流行......
  • Unity V3 初步使用 —— 为我的.NET项目从简单三层架构转到IOC做准备
    UnityV3初步使用——为我的.NET项目从简单三层架构转到IOC做准备 【前言】看过本博客的都知道(说得好像是热门博客似的,我真没法控制自己的臭美之情),本人喜欢在进入正题前总会喜欢搞点前奏,那么此文将不会再胡言乱语。马上开始。。。【Unity简介】在.NET中是一种非常流行......
  • IoC在ASP.NET Web API中的应用
    IoC在ASP.NETWebAPI中的应用 控制反转(InversionofControl,IoC),简单地说,就是应用本身不负责依赖对象的创建和维护,而交给一个外部容器来负责。这样控制权就由应用转移到了外部IoC容器,控制权就实现了所谓的反转。比如在类型A中需要使用类型B的实例,而B实例的创建并不由A来负责,......
  • C语言:程序代码与文件的羁绊
    目录为什么使用文件文件认识程序文件数据文件文件名⼆进制文件和文本文件文件的打开和关闭流标准流文件指针文件操作符详解文件的操作:参数解释:文件操作符示例文件的打开与关闭读取文件字符串读取数据块写入数据块重定位文件指针获取指针位置文件指针移到开始处清除文......