C# 流总结

注意事项:

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

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

一  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类来存储并且处理它们。

1 string str = "Hi!你好!";
2 byte[] array = Encoding.UTF8.GetBytes(str);//将字符串转化为字节数组
3 MemoryStream memory = new MemoryStream(array);//初始化MemoryStream类
4 byte[] arrayNew = memory.ToArray();//将内存中的数据转换为字节数组
5 string strNew = Encoding.UTF8.GetString(arrayNew);//将字节数组转换为字符串

MemoryStream操作字符串:

三  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这些类中得到的流。

 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  }
12
13 --------------------------------------------------------------------------------
14
15  TcpClient client = new TcpClient();//客户端tcp对象
16  client.Connect("127.0.0.1", 5000);//连接服务器
17  NetworkStream myStream = client.GetStream();//得到网络流
18
19  byte[] data = Encoding.Default.GetBytes("Hi,你好");  //首先把输入的字符串消息转换为字节
20  myStream .Write(data, 0, data.Length);  //向myStream 里写入数据
21  myStream .Flush();  //刷新流中的数据
22  myStream .Close();

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

五  StreamReader/StreamWriter类

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

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

读取与写入:

六  TextReader/TextWriter类

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

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

读取与写入:

时间: 2025-01-14 02:20:43

C# 流总结的相关文章

对IO流的操作(文件大小,拷贝,移动,删除)

import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.io.SequenceInputStream; class LjyFileClass { /*LjyFileClass工具类使用需知: * * 1.计算

hdu3461Marriage Match IV 最短路+最大流

//给一个图.给定起点和终点,仅仅能走图上的最短路 //问最多有多少种走的方法.每条路仅仅能走一次 //仅仅要将在最短路上的全部边的权值改为1.求一个最大流即可 #include<cstdio> #include<cstring> #include<iostream> #include<queue> #include<vector> using namespace std ; const int inf = 0x3f3f3f3f ; const

Java学习之IO流三

1.从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中(高效流) 1 /** 2 * 1.从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中 3 * @author vanguard 4 * 5 */ 6 public class Demo01 { 7 public static void main(String[] args) { 8 //键盘输入两个文件夹路径 9 Scanner sc = new Scanner(System.in); 1

标准文档流

标准流指的是在不使用其他的与排列和定位相关的特殊CSS规则时,各种元素的排列规则.HTML文档中的元素可以分为两大类:行内元素和块级元素.       1.行内元素不占据单独的空间,依附于块级元素,行内元素没有自己的区域.它同样是DOM树中的一个节点,在这一点上行内元素和块级元素是没有区别的.       2.块级元素总是以块的形式表现出来,并且跟同级的兄弟块依次竖直排列,左右自动伸展,直到包含它的元素的边界,在水平方向不能并排.盒子在标准流中的定位原则margin控制的是盒子与盒子之间的距离,

Properties-转换流-打印流-序列化和反序列化-Commons-IO工具类

一.Properties 类(java.util)     概述:Properties 是一个双列集合;Properties 属于map的特殊的孙子类;Properties 类没有泛型,properties集合的key和value都是固定的数据类型(String),该集合提供了一些特有的方法存取值,是唯一一个可以与IO流相结合的集合; 定义:public class Properties extends Hashtable

14. 流、文件和IO

前言 InputStream/OutStream流用来处理设备之间的数据传输 Java.io 包几乎包含了所有操作输入.输出需要的类.所有这些流类代表了输入源和输出目标. Java.io 包中的流支持很多种格式,比如:基本类型.对象.本地化字符集等等. 一个流可以理解为一个数据的序列.输入流表示从一个源读取数据,输出流表示向一个目标写数据. 流按操作数据分为两种:字节流与字符流 按流向分为:输入流(InputStream)和输出流(OutputStream) Java 为 I/O 提供了强大的而

videojs集成--播放rtmp流

之前说到已经把流推送过来了,这时候就可以使用videojs来进行显示播放. 首先要先有一个文件,那就是video-js.swf 因为,这种播放方式html已经不能很好的进行播放了,需要用到flash来播放,videojs在这个地方就用到了这个. 代码就是下面这样. 里面一些细节注释都有. 重点就是看<video>标签里面的内容 [html] view plain copy <!DOCTYPE html> <html lang="en"> <he

快速入门系列--WCF--06并发限流、可靠会话和队列服务

这部分将介绍一些相对深入的知识点,包括通过并发限流来保证服务的可用性,通过可靠会话机制保证会话信息的可靠性,通过队列服务来解耦客户端和服务端,提高系统的可服务数量并可以起到削峰的作用,最后还会对之前的事务知识做一定补充. 对于WCF服务来说,其寄宿在一个资源有限的环境中,为了实现服务性能最大化,需要提高其吞吐量即服务的并发性.然而在不进行流量控制的情况下,并发量过多,会使整个服务由于资源耗尽而崩溃.因此为相对平衡的并发数和系统可用性,需要设计一个闸门(Throttling)控制并发的数量. 由于

Java中I/O流之数据流

Java 中的数据流: 对于某问题:将一个 long 类型的数据写到文件中,有办法吗?    转字符串 → 通过 getbytes() 写进去,费劲,而且在此过程中 long 类型的数需要不断地转换. 现在,Java 中的数据流能够很好的解决这个问题(不需要转换,直接写进去) 1. DataInputStream 与 DataOutputStream 分别继承自 InputStream.OutputStream, 它属于处理流,需要分别套接在 InputStream.OutputStream 类

费用流(bzoj 3130)

Description Alice和Bob在图论课程上学习了最大流和最小费用最大流的相关知识.    最大流问题:给定一张有向图表示运输网络,一个源点S和一个汇点T,每条边都有最大流量.一个合法的网络流方案必须满足:(1)每条边的实际流量都不超过其最大流量且非负:(2)除了源点S和汇点T之外,对于其余所有点,都满足该点总流入流量等于该点总流出流量:而S点的净流出流量等于T点的净流入流量,这个值也即该网络流方案的总运输量.最大流问题就是对于给定的运输网络,求总运输量最大的网络流方案. 上图表示了一