博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 流总结(Stream)
阅读量:4469 次
发布时间:2019-06-08

本文共 3982 字,大约阅读时间需要 13 分钟。

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

内容

一  FileStream类

     FileStream类主要用于读取磁盘上的文件或者向磁盘文件写入信息。有时,我们需要将程序中的一些数据存储到磁盘上或是读取配置文件中某些内容,在这里我们就会用该类。

     从磁盘上的文件中读取内容:

FileStream file = File.Open(@"F:\file.txt", FileMode.Open); //初始化文件流byte[] array = new byte[file.Length];//初始化字节数组file.Read(array, 0, array.Length);//读取流中数据把它写到字节数组中file.Close();//关闭流string str = Encoding.Default.GetString(array);//将字节数组内容转化为字符串Console.WriteLine(str);

  将数据写入磁盘文件:

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

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

BufferedStream封装流FileStream file1 = File.Open(@"F:\file1.txt", FileMode.OpenOrCreate,FileAccess.Read);//读取文件流FileStream file 2= File.Open(@"F:\file2.txt", FileMode.OpenOrCreate,FileAccess.Write);//写入文件流byte[] array = new byte[4096];      BufferedStream bufferedInput = new BufferedStream(file1);//封装文件流BufferedStream bufferedOutput = new BufferedStream(file2);//封装文件流bufferedInput.Read(array, 0, array.Length);bufferedOutput.Write(array, 0, array.Length);int bytesRead = 0;while ((bytesRead = bufferedInput.Read(array, 0, 4096)) > 0)//读取到了数据  {    bufferedOutput.Write(array, 0, bytesRead);    Console.WriteLine(bytesRead);   }bufferedInput.Close();//关闭各种流bufferedOutput.Close();file1.Close();file2.Close();

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

四 NetWorkStream类

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

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

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

五  StreamReader/StreamWriter类

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

     读取与写入:

StreamReader/Writer读写StreamReader reader = new StreamReader("filePath");//初始化读取StreamWriter writer = new StreamWriter("filePath");//初始化写入string readStr=reader.ReadLine();//从流中读取一行string readAff = reader.ReadToEnd();//从流中读取全部writer.Write("Hi 你好");//写入内容writer.WriteLine("Hi 你好");//写入一行reader.Close();//关闭流writer.Close();

六  TextReader/TextWriter类

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

     读取与写入:

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

注意事项:

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

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

转载于:https://www.cnblogs.com/answercard/p/5077417.html

你可能感兴趣的文章
软件设计师-算法
查看>>
小米手机安装Google框架
查看>>
honpeyhonepy
查看>>
netaddr网络地址工具python
查看>>
OSI7层模型和网络排错、网络安全
查看>>
hash文件-对文件进行数字签名
查看>>
TCP_Wrappers基础知识介绍
查看>>
Central Post Office (Shiraz University Local Contest 2011 ) 树状dp
查看>>
51Nod - 1031 骨牌覆盖
查看>>
回顾环信使用
查看>>
JavaScript--函数对象的属性caller与callee
查看>>
特殊字符大全
查看>>
SQL - SQL 连接 JOIN 例解。(左连接,右连接,全连接,内连接,交叉连接,自连接)[转]...
查看>>
《learning hard C#学习笔记》读书笔记(20)异步编程
查看>>
动态创建Struct实例
查看>>
Jsp通过JDBC连接到SQL Server2008数据库遇到的几个问题
查看>>
idea 不能编译生成class文件
查看>>
javascript原生百叶窗
查看>>
单播组播和广播
查看>>
JSPatch - iOS 动态补丁
查看>>