前言

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

内容

一  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 FileStream file = File.Open(@"F:\file.txt", FileMode.Append);//初始化文件流
2 byte[] array = Encoding.UTF8.GetBytes("Hello World!你好");//给字节数组赋值
3 file.Write(array, 0, array.Length);//将字节数组写入文件流
4 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包装过的流,先在内存中进行统一的处理再向磁盘中写入数据,也会提高写入的效率。

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

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

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

四 NetWorkStream类

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

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

 1 TcpListener lis=new TcpListener(5000); //服务器监听
2 lis.Start();//启动
3 Socket sock=lis.AcceptSocket();//阻塞,直到有客户端连接
4
5 NetworkStream networkStream = new NetworkStream(sock);//得到Socket中的流
6 if (netStream.DataAvailable) //如果客户端发送了消息
7 {
8 byte[] data = new byte[1024]; //定义一个字节数组,用来存放接收的数据
9 int len = netStream.Read(data, 0, data.Length); //从位置开始,读取到字节数组末尾
10 string line = Encoding.Default.GetString(data, 0, len); //把收到的字节转换为字符串
11 }
1 TcpClient client = new TcpClient();//客户端tcp对象
2 client.Connect("127.0.0.1", 5000);//连接服务器
3 NetworkStream myStream = client.GetStream();//得到网络流
4
5 byte[] data = Encoding.Default.GetBytes("Hi,你好"); //首先把输入的字符串消息转换为字节
6 myStream .Write(data, 0, data.Length); //向myStream 里写入数据
7 myStream .Flush(); //刷新流中的数据
8 myStream .Close();

五  StreamReader/StreamWriter类

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

读取与写入:

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

六  TextReader/TextWriter类

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

读取与写入:

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

注意事项:

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

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

C# 流总结的更多相关文章

  1. 使用C#处理基于比特流的数据

    使用C#处理基于比特流的数据 0x00 起因 最近需要处理一些基于比特流的数据,计算机处理数据一般都是以byte(8bit)为单位的,使用BinaryReader读取的数据也是如此,即使读取bool型 ...

  2. HTML 事件(三) 事件流与事件委托

    本篇主要介绍HTML DOM中的事件流和事件委托. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4 ...

  3. FILE文件流的中fopen、fread、fseek、fclose的使用

    FILE文件流用于对文件的快速操作,主要的操作函数有fopen.fseek.fread.fclose,在对文件结构比较清楚时使用这几个函数会比较快捷的得到文件中具体位置的数据,提取对我们有用的信息,满 ...

  4. java.IO输入输出流:过滤流:buffer流和data流

    java.io使用了适配器模式装饰模式等设计模式来解决字符流的套接和输入输出问题. 字节流只能一次处理一个字节,为了更方便的操作数据,便加入了套接流. 问题引入:缓冲流为什么比普通的文件字节流效率高? ...

  5. java 字节流与字符流的区别

    字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢?实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作 ...

  6. BZOJ 3504: [Cqoi2014]危桥 [最大流]

    3504: [Cqoi2014]危桥 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1407  Solved: 703[Submit][Status] ...

  7. java I/O流

    输入流(读取数据的流) BufferedInputStream---继承--->FileInputStream--继承--->InputStream------> (1)字节流操作中 ...

  8. Ford-Fulkerson 最大流算法

    流网络(Flow Networks)指的是一个有向图 G = (V, E),其中每条边 (u, v) ∈ E 均有一非负容量 c(u, v) ≥ 0.如果 (u, v) ∉ E 则可以规定 c(u, ...

  9. .NET基础拾遗(3)字符串、集合和流

    Index: (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基础 ...

  10. C#开源实现MJPEG流传输

    本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 许久以前写了篇文章<基于.NET打造IP智能网络视频监控系统>,记录和介绍了自己几年来积 ...

随机推荐

  1. echarts4的学习

    echarts的学习 1.echarts的全解注释.https://www.2cto.com/kf/201708/665624.html ### 2.从echarts3开始学习echarts源码.ht ...

  2. Spring中的@Async

    在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在spring 3.x之后, ...

  3. L0 Regularization

    参考: Learning Sparse Neural Networks through L0 Regularization The Variational Garrote

  4. android Studio 出现:Unable to resolve dependency for ':app@debug/compileClasspath'

    li经千辛万苦,我的新工程gradle搞定了 但是却在变异的时候告诉我 Unable to resolve dependency for ':app@debug/compileClasspath'xx ...

  5. python入门-基础语法

    一.变量 定义字符串要加单引号‘’ 变量命名规范: 变量名只能是字母.数字或下划线的任意组合 变量名的第一个字符不能是数字 变量名不能用关键字 变量名不要用中文 变量名不要太长,区分大小写 面就用单引 ...

  6. js中用户名的正则(字符,数字,下划线,减号)

    <!DOCTYPE html><html><head><meta charset="UTF-8"><title>Inse ...

  7. fiddler抓取用tomcat来部署的项目接口请求包

    Fiddler 是以代理web服务器的形式工作的,它使用代理地址:127.0.0.1,端口:8888. 当Fiddler退出的时候它会自动注销, 这样就不会影响别的程序.关于fiddler这个工具的使 ...

  8. 跟随我在oracle学习php(2)

    在制作网页之前,先看一些常用标签的具体用法,上次我给出了常用标签表格,我们来一个一个看一看. 首先是<a>,他的第一个用法就是超链接,格式为<a href=”你想要跳转到的网页地址” ...

  9. CCF关于NOIP竞赛程序提交的管理规则

    在NOIP复赛中,NOI各省组织单位必须严格遵循CCF<关于NOIP数据提交格式的说明>的规范在竞赛结束后规定时间内向CCF提交本赛区所有参赛选手的程序. 为竞赛的公平以及赛后按时完成竞赛 ...

  10. linux远程管理常用命令

    目标 关机/重启 shutdown 查看或配置网卡信息 ifconfig ping 远程登录和复制文件 ssh scp 01. 关机/重启 序号 命令 对应英文 作用 01 shutdown 选项 时 ...