C# 流总结(Stream)
本篇文章简单总结了在C#编程中经常会用到的一些流。比如说FileStream、MemoryStream、 BufferedStream、 NetWorkStream、 StreamReader/StreamWriter、 TextReader/TextWriter等的简单用法。
内容
一 FileStream类
FileStream类主要用于读取磁盘上的文件或者向磁盘文件写入信息。有时,我们需要将程序中的一些数据存储到磁盘上或是读取配置文件中某些内容,在这里我们就会用该类。
从磁盘上的文件中读取内容:
FileStream file = File.Open(@"F:\file.txt", FileMode.Open); //初始化文件流
byte[] array = new byte[file.Length];//初始化字节数组
file.Read(array, , array.Length);//读取流中数据把它写到字节数组中
file.Close();//关闭流
string str = Encoding.Default.GetString(array);//将字节数组内容转化为字符串
Console.WriteLine(str);
将数据写入磁盘文件:
FileStream file = File.Open(@"F:\file.txt", FileMode.Append);//初始化文件流
byte[] array = Encoding.UTF8.GetBytes("Hello World!你好");//给字节数组赋值
file.Write(array, , array.Length);//将字节数组写入文件流
file.Close();//关闭流
二 MemoryStream类
MemoryStream类主要用于操作内存中的数据。比如说网络中传输数据时可以用流的形式,当我们收到这些流数据时就可以声明MemoryStream类来存储并且处理它们。
MemoryStream操作字符串:
string str = "Hi!你好!";
byte[] array = Encoding.UTF8.GetBytes(str);//将字符串转化为字节数组
MemoryStream memory = new MemoryStream(array);//初始化MemoryStream类
byte[] arrayNew = memory.ToArray();//将内存中的数据转换为字节数组
string strNew = Encoding.UTF8.GetString(arrayNew);//将字节数组转换为字符串
三 BufferedStream类
BufferedStream类主要也是用来处理流数据的,但是该类主要的功能是用来封装其他流类。为什么要封装其他流类,这么做的意义是什么?按照微软的话说主要是减少某些流直接操作存储设备的时间。对于一些流来说直接向磁盘中存储数据这种做法的效率并不高,用BufferedStream包装过的流,先在内存中进行统一的处理再向磁盘中写入数据,也会提高写入的效率。
将磁盘上的一个文件写入到磁盘上的另一个文件中:
BufferedStream封装流
FileStream file1 = File.Open(@"F:\file1.txt", FileMode.OpenOrCreate,FileAccess.Read);//读取文件流
FileStream file = File.Open(@"F:\file2.txt", FileMode.OpenOrCreate,FileAccess.Write);//写入文件流 byte[] array = new byte[]; BufferedStream bufferedInput = new BufferedStream(file1);//封装文件流
BufferedStream bufferedOutput = new BufferedStream(file2);//封装文件流 bufferedInput.Read(array, , array.Length);
bufferedOutput.Write(array, , array.Length); int bytesRead = ;
while ((bytesRead = bufferedInput.Read(array, , )) > )//读取到了数据
{
bufferedOutput.Write(array, , bytesRead);
Console.WriteLine(bytesRead);
}
bufferedInput.Close();//关闭各种流
bufferedOutput.Close();
file1.Close();
file2.Close();
实际测试中,封装流的方法在效率上并没有太多的提升。使用其他流也可以封装文件流。如果想要保证不频繁的读取磁盘其实只要保证代码不这样做就可以了,所以其实在代码上多加控制,也能保证程序不会经常的操作磁盘。
四 NetWorkStream类
NetWorkStream类是专门用来处理服务器与客户端通信的流。它在网络编程中经常使用,主要是用来处理类似Socket、TcpClient和TcpListener这些类中得到的流。
简单的TCP同步方式服务器与客户端通信:
服务器
TcpListener lis=new TcpListener(); //服务器监听
lis.Start();//启动
Socket sock=lis.AcceptSocket();//阻塞,直到有客户端连接 NetworkStream networkStream = new NetworkStream(sock);//得到Socket中的流
if (netStream.DataAvailable) //如果客户端发送了消息
{
byte[] data = new byte[]; //定义一个字节数组,用来存放接收的数据
int len = netStream.Read(data, , data.Length); //从位置开始,读取到字节数组末尾
string line = Encoding.Default.GetString(data, , len); //把收到的字节转换为字符串
}
客户端
TcpClient client = new TcpClient();//客户端tcp对象
client.Connect("127.0.0.1", );//连接服务器
NetworkStream myStream = client.GetStream();//得到网络流 byte[] data = Encoding.Default.GetBytes("Hi,你好"); //首先把输入的字符串消息转换为字节
myStream .Write(data, , data.Length); //向myStream 里写入数据
myStream .Flush(); //刷新流中的数据
myStream .Close();
五 StreamReader/StreamWriter类
StreamReader/StreamWriter主要用来处理流数据。它们分别提供了高效的流读取/写入功能。
读取与写入:
StreamReader/Writer读写
StreamReader reader = new StreamReader("filePath");//初始化读取
StreamWriter writer = new StreamWriter("filePath");//初始化写入 string readStr=reader.ReadLine();//从流中读取一行
string readAff = reader.ReadToEnd();//从流中读取全部 writer.Write("Hi 你好");//写入内容
writer.WriteLine("Hi 你好");//写入一行 reader.Close();//关闭流
writer.Close();
六 TextReader/TextWriter类
TextReader/TextWriter类主要用来处理流数据。它们分别提供了高效的文本流读取/写入功能。
读取与写入:
TextReader/Writer读写
TextReader textReader = new StringReader("Hi 你好");//初始化读取流
TextWriter textWriter = new StringWriter();//初始化写入流 char[] c=new char[];
int chars = ;
while ((chars = textReader.Read(c, , )) > )//把流中数据写入到字符数组中
{
textWriter.Write(c, , );//从字符数组中读取流
} string str= textWriter.ToString();//将流中数据写到字符串中
textReader.Close();//关闭流
textWriter.Close();
注意事项:
1.流使用后必须要关闭。
2.把流中数据加载到内存时要考虑内存溢出等问题。
C# 流总结(Stream)的更多相关文章
- C# 的 WCF文章 消息契约(Message Contract)在流(Stream )传输大文件中的应用
		我也遇到同样问题,所以抄下做MARK http://www.cnblogs.com/lmjq/archive/2011/07/19/2110319.html 刚做完一个binding为netTcpBi ... 
- 创建一个流(Stream)可以让Bitmap或Image保存到流里面(转)
		创建一个流(Stream)可以让Bitmap或Image使用save方法将已经在bitmap上生成的图像 保存到流里面?不需要直接在硬盘上生成文件 -------------------------- ... 
- nodeJs文件系统(fs)与流(stream)
		一.简介 本文将介绍node.js文件系统(fs)和流(stream)的一些API已经参数使用情况. 二.目录 文件系统将介绍以下方法: 1.fs.readFile 2.fs.writeFile 3. ... 
- 海量数据挖掘MMDS week3:流算法Stream Algorithms
		http://blog.csdn.net/pipisorry/article/details/49183379 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ... 
- mongoose中的流查询stream query
		mongoose中的流查询stream query,功能类似于php中的mysql_fetch_array,每次从集合中获取一条记录(文档) var cursor = Person.find({ oc ... 
- 创建一个流(Stream)可以让Bitmap或Image保存到流里面
		创建一个流(Stream)可以让Bitmap或Image保存到流里面 http://blog.csdn.net/angxiao/article/details/7481465 写文件流 ... 
- Storm概念学习系列之Stream消息流 和 Stream Grouping 消息流组
		不多说,直接上干货! Stream消息流是Storm中最关键的抽象,是一个没有边界的Tuple序列. Stream Grouping 消息流组是用来定义一个流如何分配到Tuple到Bolt. Stre ... 
- 在java程序中,对于数据的输入/输出操作以“流”(stream)方式进行
		在java程序中,对于数据的输入/输出操作以“流”(stream)方式进行 
- CUDA流(Stream)
		CUDA流表示一个GPU操作队列,该队列中的操作将以添加到流中的先后顺序而依次执行.可以将一个流看做是GPU上的一个任务,不同任务可以并行执行.使用CUDA流,首先要选择一个支持设备重叠(Device ... 
- [.Net,C#]三类资源:流对象Stream,字节数组byte[],图片Image
		三类资源:流对象Stream,字节数组byte[],图片Image 关系:Stream<=>byte[],byte[]<=>Image Stream 与Image相互转化的媒介 ... 
随机推荐
- 后台管理-基于 Bootstrap 开发的网站后台管理面板
			Bootstrap 开发框架真的很强大,今天推荐几个非常不错的基于 Bootstrap 开发的网站后台管理面板,全部都是响应式布局,细节做得都很不错.可以搜索keenthemes. Metronic ... 
- cygwin下安装scws
			安装gcc和make命令 1.找到cygwin的etc目录中有一个名为passwd的文件. 2.用UE或记事本打开passwd这个文件,找到以下部分,把其中的windows用户名admin换成ro ... 
- MySQL 添加外键约束,不检查现有数据
			这可能是MySQL在InnoDB中设置了foreign key关联,造成无法更新或删除数据.可以通过设置FOREIGN_KEY_CHECKS变量来避免这种情况. SET FOREIGN_KEY_CHE ... 
- 如何读取xml文件,根据xml节点属性查询并输出xml文件
			主要是应用SimpleXML和递归函数来根据key值来查询,并将结果以xml格式输出. <?php header("Content-type: text/xml"); //以 ... 
- HDU 1823 Luck and Love  二维线段树(树套树)
			点击打开链接 Luck and Love Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ... 
- Android异步任务处理框架AsyncTask源代码分析
			[转载请注明出处:http://blog.csdn.net/feiduclear_up CSDN 废墟的树] 引言 在平时项目开发中难免会遇到异步耗时的任务(比方最常见的网络请求).遇到这样的问题.我 ... 
- POJ 2677  旅行商问题 双调dp或者费用流
			Tour Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3408 Accepted: 1513 Description ... 
- node定时任务——node-schedule模块使用说明
			在实际开发项目中,会遇到很多定时任务的工作.比如:定时导出某些数据.定时发送消息或邮件给用户.定时备份什么类型的文件等等. 一般可以写个定时器,来完成相应的需求,在node.js中自已实现也非常容易, ... 
- ubuntu下禁用和恢复触摸板
			1.一般禁用选项在 settings > mouse and touchpad 中.(16.04通过实验)如果无法禁用或者希望恢复,向下看. 2.命令行键入: xinput ,插卡touchpa ... 
- Linux 进程资源用量监控和按用户设置进程限制
			每个 Linux 系统管理员都应该知道如何验证硬件.资源和主要进程的完整性和可用性.另外,基于每个用户设置资源限制也是其中一项必备技能. 在这篇文章中,我们会介绍一些能够确保系统硬件和软件正常工作的方 ... 
