前言

本篇文章简单总结了在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. Java 设置PDF文档背景——单色背景、图片背景

    一般生成的PDF文档默认的文档底色为白色,我们可以通过一定方法来更改文档的背景色,以达到文档美化的作用. 以下内容提供了Java编程来设置PDF背景色的方法.包括2种设置方法: 设置纯色背景色 设置图 ...

  2. ActiveRecord Nested Atrributes 关联记录,对嵌套属性进行CURD

    设置了Nested attributes后,你可以通过父记录来更新/新建/删除关联记录. 使用: #accepts_nested_attributes_for class method. 例如: cl ...

  3. 弹性盒式布局flexbox(dispaly:flex)

    display:flex flex-direction: row(行)/column(列)/row-reverse/column-reverse反方向  //布局 justify-content: s ...

  4. android -------- 获取手机设备信息

    最近在开发中,需要用到一些系统信息,总结了一下 /** * Created by zhangqie on 2019/2/26 * Describe: 系统工具类 */ public class Equ ...

  5. 『PyTorch × TensorFlow』第十七弹_ResNet快速实现

    『TensorFlow』读书笔记_ResNet_V2 对比之前的复杂版本,这次的torch实现其实简单了不少,不过这和上面的代码实现逻辑过于复杂也有关系. 一.PyTorch实现 # Author : ...

  6. 92. Reverse Linked List II 反转链表 II

    网址:https://leetcode.com/problems/reverse-linked-list-ii/ 核心部分:通过a.b.c三个变量之间的相互更新,不断反转部分链表 然后将反转部分左右两 ...

  7. .NET学习日记【1】

    不得不说,之前一年学习的内容基本上在第一章中都有所涉及,而且还讲了很多不知道知识.看完第一张对多态和继承都多了一些体会.在1.4前面的都有很认证的看过,也在vs上面验证了一下.然后也明白了.NET到底 ...

  8. StrokePlus常用脚本

    1.按照时间创建文本文件并打开 文本文件并没有什么快捷方式,每次都要右键,找新建,找文本文档,临时写点什么还要保存,写名字,懒得写就打aa,bb的,挺烦的. 难点在于用lua没法知道当前鼠标所在的文件 ...

  9. learning makefile static model

  10. PXE 实现自动装机

    搭建 PXE 远程安装服务器 image_1cqg00g0os9b1pop122e98o19ef9b.png-255kB 1.把光盘源放在/var/ftp/centos6 因为远程装机对放服务器得读取 ...