前言

本篇文章简单总结了在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. 雷林鹏分享:jQuery EasyUI 数据网格 - 使用虚拟滚动视图显示海量数据

    jQuery EasyUI 数据网格 - 使用虚拟滚动视图显示海量数据 数据网格(datagrid)的虚拟滚动特性可以用来显示大数量的记录而不需要分页. 当滚动垂直滚动条时,数据网格(datagrid ...

  2. 问题处理:Library not loaded: /usr/local/opt/readline/lib/libreadline.7.dylib (LoadError)

    进入rails 文件夹, terminal输入rails console报告❌. 类似下面的 Running via Spring preloader Traceback (most recent c ...

  3. python和jupyter安装

    python官网:https://www.python.org/ 进去之后选择适合自己电脑的系统类型,安装,我的是windows  下载之后,双击打开 在安装时请勾选上add to path 选项,安 ...

  4. SAP WDA 自建Portal

    1.新建Package:ZWDA. 2.新建Portal用户表:ZPORTAL_USER 上图中是基于CRM的BP来做的用户表,如果针对其他系统可以使用组织架构里的角色用户... 3.新建用户视图配置 ...

  5. requestAnimationFrame 兼容不同浏览器

    简单兼容: window.requestAnimFrame = (function(){ return window.requestAnimationFrame || window.webkitReq ...

  6. netty源码分析之二:accept请求

    我在前面说过了server的启动,差不多可以看到netty nio主要的东西包括了:nioEventLoop,nioMessageUnsafe,channelPipeline,channelHandl ...

  7. Maximum Average Subarray

    Given an array with positive and negative numbers, find the maximum average subarray which length sh ...

  8. ionic3 自定义组件 滑动选择器 ion-multi-picker

    1.ionic3中有一个 ion-datatime 给大家选择时间提供了一个很方便的组件 效果如图  链接  https://ionicframework.com/docs/api/component ...

  9. Windows10 bypassUAC绕过用户账户控制

    使用这个github上的项目: https://github.com/L3cr0f/DccwBypassUAC 可以自行编译 全程UAC不介入,没反应. 测试: 权限提升真实有效

  10. Vue+WebSocket 实现页面实时刷新长连接

    最近vue项目要做数据实时刷新,折线图每秒重画一次,数据每0.5秒刷新一次,说白了就是实时刷新,因为数据量较大,用定时器估计页面停留一会就会卡死... 与后台人员讨论过后决定使用h5新增的WebSoc ...