C# 流总结
前言
本篇文章简单总结了在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# 流总结的更多相关文章
- 使用C#处理基于比特流的数据
使用C#处理基于比特流的数据 0x00 起因 最近需要处理一些基于比特流的数据,计算机处理数据一般都是以byte(8bit)为单位的,使用BinaryReader读取的数据也是如此,即使读取bool型 ...
- HTML 事件(三) 事件流与事件委托
本篇主要介绍HTML DOM中的事件流和事件委托. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4 ...
- FILE文件流的中fopen、fread、fseek、fclose的使用
FILE文件流用于对文件的快速操作,主要的操作函数有fopen.fseek.fread.fclose,在对文件结构比较清楚时使用这几个函数会比较快捷的得到文件中具体位置的数据,提取对我们有用的信息,满 ...
- java.IO输入输出流:过滤流:buffer流和data流
java.io使用了适配器模式装饰模式等设计模式来解决字符流的套接和输入输出问题. 字节流只能一次处理一个字节,为了更方便的操作数据,便加入了套接流. 问题引入:缓冲流为什么比普通的文件字节流效率高? ...
- java 字节流与字符流的区别
字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢?实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作 ...
- BZOJ 3504: [Cqoi2014]危桥 [最大流]
3504: [Cqoi2014]危桥 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1407 Solved: 703[Submit][Status] ...
- java I/O流
输入流(读取数据的流) BufferedInputStream---继承--->FileInputStream--继承--->InputStream------> (1)字节流操作中 ...
- Ford-Fulkerson 最大流算法
流网络(Flow Networks)指的是一个有向图 G = (V, E),其中每条边 (u, v) ∈ E 均有一非负容量 c(u, v) ≥ 0.如果 (u, v) ∉ E 则可以规定 c(u, ...
- .NET基础拾遗(3)字符串、集合和流
Index: (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基础 ...
- C#开源实现MJPEG流传输
本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 许久以前写了篇文章<基于.NET打造IP智能网络视频监控系统>,记录和介绍了自己几年来积 ...
随机推荐
- Virtualbox安装增强功能时显示【未能加载虚拟光盘】
我之前在安装Virtualbox时进行到安装增强功能时弹出了一个窗口,提示我"未能加载虚拟光盘到虚拟电脑",如下图 我尝试了多次都是这个情况,经过上网学习我找到了问题所在,我在第一 ...
- style.width与offsetWidth的区别
1. style.width只能读取内联样式,offsetWidth都可以读取: 2. style.width读取的值带“px”单位,offsetWidth读取纯数值: 3. style.width获 ...
- Python 小节回顾
1.python程序是大小写敏感. 2.python中字符串是用单引号 ' 或双引号 " 括起来的任意文本. python中用 r ' ' 表示 ' ' 内部的字符串不转义. 3.在pyt ...
- C#Windows窗体中添加了AxWindowsMediaPlayer的详细用法影响键盘操作的问题
最近在写一个飞机大战游戏,但在为游戏背景添加声音的时候,发现添加了AxWindowsMediaPlayer的详细用法音乐控件不能再通过键盘控制飞机的移动了,在网上查了许久,没找到原因,差点就想去找老师 ...
- 6、什么是TypeScript、TypeScript的安装、转换为.js文件
1.什么是TypeScript (本人用自己的理解梳理了一下,不代表官方意见) TypeScript:Type+ECMAScript6 TypeScript是一种预处理编程语言,遵循es6标准规范,在 ...
- vue的.vue文件是怎么run起来的(vue-loader)
vue的.vue文件是怎么run起来的(vue-loader) 引子:vue的.vue文件是怎么跑起来的? 答:通过vue-loader,解析.vue文件,在webpack解析,拆解vue组件 1.v ...
- learning makefile = and :=
- java使用valueOf的方法反转字符串输出
public class FanZhuan { public static void main(String[] args) { String s = "987654321088123abo ...
- Android 关于arm64-v8a、armeabi-v7a、armeabi、x86下的so文件兼容问题
Android 设备的CPU类型(通常称为”ABIs”) 引用: https://blog.csdn.net/ouyang_peng/article/details/51168072 armeabiv ...
- URL和URI(简单介绍)
URL与URI 我们经常接触到的就是URL了,它就是我们访问web的一个字符串地址,那么URI是什么呢?他们是什么关系呢? URL:uniform resource location 统一资源定位符U ...