王朝网络
分享
 
 
 

关于c#流

王朝学院·作者佚名  2016-05-20  
宽屏版  字体: |||超大  

关于c#流C#流的简单认识前言本篇文章简单总结了在C#编程中经常会用到的一些流。比如说FileStream、MemoryStream、 BufferedStream、 NetWorkStream、 StreamReader/StreamWriter、 TextReader/TextWriter等的简单用法。

内容

一 FileStream类

FileStream类主要用于读取磁盘上的文件或者向磁盘文件写入信息。有时,我们需要将程序中的一些数据存储到磁盘上或是读取配置文件中某些内容,在这里我们就会用该类。

从磁盘上的文件中读取内容:

FileStream读取文件:

1 FileStream file = File.Open(@"F:\file.txt", FileMode.Open); //初始化文件流2 byte[] array = new byte[file.Length];//初始化字节数组3 file.Read(array, 0, array.Length);//读取流中数据把它写到字节数组中4 file.Close();//关闭流5 string str = Encoding.Default.GetString(array);//将字节数组内容转化为字符串6 Console.WriteLine(str);

将数据写入磁盘文件:

1 1 FileStream file = File.Open(@"F:\file.txt", FileMode.Append);//初始化文件流2 2 byte[] array = Encoding.UTF8.GetBytes("Hello World!你好");//给字节数组赋值3 3 file.Write(array, 0, array.Length);//将字节数组写入文件流4 4 file.Close();//关闭流

FileStream写入文件

二 MemoryStream类

MemoryStream类主要用于操作内存中的数据。比如说网络中传输数据时可以用流的形式,当我们收到这些流数据时就可以声明MemoryStream类来存储并且处理它们。

MemoryStream操作字符串:

1 string str = "Hi!你好!";2 byte[] array = Encoding.UTF8.GetBytes(str);//将字符串转化为字节数组3 MemoryStream memory = new MemoryStream(array);//初始化MemoryStream类4 byte[] arrayNew = memory.ToArray();//将内存中的数据转换为字节数组5 string strNew = Encoding.UTF8.GetString(arrayNew);//将字节数组转换为字符串

MemoryStream解析数据

三 BufferedStream类

BufferedStream类主要也是用来处理流数据的,但是该类主要的功能是用来封装其他流类。为什么要封装其他流类,这么做的意义是什么?按照微软的话说主要是减少某些流直接操作存储设备的时间。对于一些流来说直接向磁盘中存储数据这种做法的效率并不高,用BufferedStream包装过的流,先在内存中进行统一的处理再向磁盘中写入数据,也会提高写入的效率。

将磁盘上的一个文件写入到磁盘上的另一个文件中:

1 1 FileStream file1 = File.Open(@"F:\file1.txt", FileMode.OpenOrCreate,Fileaccess.Read);//读取文件流 2 2 FileStream file 2= File.Open(@"F:\file2.txt", FileMode.OpenOrCreate,FileAccess.Write);//写入文件流 3 3 4 4 byte[] array = new byte[4096]; 5 5 6 6 BufferedStream bufferedInput = new BufferedStream(file1);//封装文件流 7 7 BufferedStream bufferedOutput = new BufferedStream(file2);//封装文件流 8 8 9 9 bufferedInput.Read(array, 0, array.Length);10 10 bufferedOutput.Write(array, 0, array.Length);11 11 12 12 int bytesRead = 0;13 13 while ((bytesRead = bufferedInput.Read(array, 0, 4096)) > 0)//读取到了数据14 14 {15 15 bufferedOutput.Write(array, 0, bytesRead);16 16 Console.WriteLine(bytesRead);17 17 }18 18 bufferedInput.Close();//关闭各种流19 19 bufferedOutput.Close();20 20 file1.Close();21 21 file2.Close();

BufferedStream封装流

实际测试中,封装流的方法在效率上并没有太多的提升。使用其他流也可以封装文件流。如果想要保证不频繁的读取磁盘其实只要保证代码不这样做就可以了,所以其实在代码上多加控制,也能保证程序不会经常的操作磁盘。

四 NetWorkStream类

NetWorkStream类是专门用来处理服务器与客户端通信的流。它在网络编程中经常使用,主要是用来处理类似Socket、TcpClient和TcpListener这些类中得到的流。

简单的TCP同步方式服务器与客户端通信:

1 1 TcpListener lis=new TcpListener(5000); //服务器监听 2 2 lis.Start();//启动 3 3 Socket sock=lis.AcceptSocket();//阻塞,直到有客户端连接 4 4 5 5 NetworkStream networkStream = new NetworkStream(sock);//得到Socket中的流 6 6 if (netStream.DataAvailable) //如果客户端发送了消息 7 7 { 8 8 byte[] data = new byte[1024]; //定义一个字节数组,用来存放接收的数据 9 9 int len = netStream.Read(data, 0, data.Length); //从位置开始,读取到字节数组末尾10 10 string line = Encoding.Default.GetString(data, 0, len); //把收到的字节转换为字符串11 11 }

服务器

1 1 TcpClient client = new TcpClient();//客户端tcp对象2 2 client.Connect("127.0.0.1", 5000);//连接服务器3 3 NetworkStream myStream = client.GetStream();//得到网络流4 4 5 5 byte[] data = Encoding.Default.GetBytes("Hi,你好"); //首先把输入的字符串消息转换为字节6 6 myStream .Write(data, 0, data.Length); //向myStream 里写入数据7 7 myStream .Flush(); //刷新流中的数据8 8 myStream .Close();

客户端

五 StreamReader/StreamWriter类

StreamReader/StreamWriter主要用来处理流数据。它们分别提供了高效的流读取/写入功能。

读取与写入:

1 1 StreamReader reader = new StreamReader("filePath");//初始化读取 2 2 StreamWriter writer = new StreamWriter("filePath");//初始化写入 3 3 4 4 string readStr=reader.ReadLine();//从流中读取一行 5 5 string readAff = reader.ReadToEnd();//从流中读取全部 6 6 7 7 writer.Write("Hi 你好");//写入内容 8 8 writer.WriteLine("Hi 你好");//写入一行 9 9 10 10 reader.Close();//关闭流11 11 writer.Close();

StreamReader/Writer读写

六 TextReader/TextWriter类

TextReader/TextWriter类主要用来处理流数据。它们分别提供了高效的文本流读取/写入功能。

读取与写入:

1 1 TextReader textReader = new StringReader("Hi 你好");//初始化读取流 2 2 TextWriter textWriter = new StringWriter();//初始化写入流 3 3 4 4 char[] c=new char[4096]; 5 5 int chars = 0; 6 6 while ((chars = textReader.Read(c, 0, 4096)) > 0)//把流中数据写入到字符数组中 7 7 { 8 8 textWriter.Write(c, 0, 4096);//从字符数组中读取流 9 9 }10 10 11 11 string str= textWriter.ToString();//将流中数据写到字符串中12 12 textReader.Close();//关闭流13 13 textWriter.Close();

TextReader/Writer读写

注意事项:

1.流使用后必须要关闭。

2.把流中数据加载到内存时要考虑内存溢出等问题。

分类: C#

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有