C# 流总结(Stream)

本篇文章简单总结了在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.把流中数据加载到内存时要考虑内存溢出等问题。

时间: 2024-10-26 04:33:16

C# 流总结(Stream)的相关文章

Java-函数式编程(三)流(Stream)

流使程序猿可以在抽象层上对集合进行操作. 从外部迭代到内部迭代 什么是外部迭代和内部迭代呢? 个人认为,外和内是相对集合代码而言. 如果迭代的业务执行在应用代码中,称之为外部迭代. 反之,迭代的业务执行在集合代码中,称为内部迭代(函数式编程). 语言描述可能有点抽象,下面看实例. 1. 外部迭代 调用itrator方法,产生一个新的Iterator对象,进而控制整个迭代过程. for (Student student:list){ if (student.getAge()>18){ result

201902161119_《Node.js之流(Stream)一二事(1)》

... 1. 相比fs.readFile();  fs.createReadStream();分段读取更利于读文件, 可以读取4G文件, 前者方法的话buffer溢出 2. stream的end和close有区别, 前者是资源没了,后者是破坏资源流(文件pipe)的"管子" 3.  A.pipe(B); //  相当于 A | B, 从A到B 4. ... 原文地址:https://www.cnblogs.com/beesky520/p/10387135.html

nodeJs文件系统(fs)与流(stream)

文件系统(File System): 在Node中,文件系统的交互是非常重要的,服务器的本质就是将本地的文件发送给客户端, Node通过fs模块来和文件系统进行交互,该模块提供了一些标准的文件访问API类打开.读取.写入文件.以及与其交互. 要是用fs模块,首先要从核心模块中加载: 使用 const fs= require('fs') ; 来引入 fs使用特点: fs模块中的所有操作都有两种形式可供选择同步和异步, 同步文件系统会阻塞程序的执行,也就是除非操作完毕,否则不会向下执行代码. 异步文

Stream消息流 和 Stream Grouping 消息流组

对集合进行并行计算方法选择的建议:stream的并行流,CompletableFuture

对于集合的并行计算,我们是要使用流(stream)还是CompletableFuture? 如果进行的是计算密集型的操作,并且没有I/O,那么推荐Stream接口,因为实现简单,同时效率也是最高的(如果所         有的线程都是计算密集型的,那就没有必要创建比处理器核数更多的线程). 反之,如果你并行的工作单元还涉及等待I/O的操作(包括网络连接等待),那么使用CompletableFuture灵活性更             好,你可以根据Nthreads=Ncpu * Ucpu * (

XMPP协议扩展:XEP-0198 流管理(Stream Management)中文翻译(个人整理,难免有翻译错的地方,请多多指正)

QQ讨论群:172158202 转载原文地址:http://blog.csdn.net/yuedong56/article/details/38120101 xep-0198英文文档链接地址:点击打开链接 RFC 6120中文链接地址:点击打开链接 相关參考1:点击打开链接 1.介绍 XMPP Core 用XMPP定义了流的XML技术(也就是流的建立和终止,包含认证和加密).可是核心的XMPP协议并没有为管理一个灵活的XML流提供工具. Stream Management背后的基本概念是.初始化

XEP-0198 流管理(Stream Management)中文翻译

RFC 6120中文链接地址:点击打开链接 参考:点击打开链接 1.介绍 XMPP Core 用XMPP定义了流的XML技术(也就是流的建立和终止,包括认证和加密).但是核心的XMPP协议并没有为管理一个灵活的XML流提供工具. Stream Management背后的基本概念是,初始化的实体(一个服务端或者客户端)和接收的实体(一个服务端)可以为更灵活的管理stream交换"命令".下面两条 Stream Management的特性被广泛的关注,因为它们可以提高网络的可靠性和终端用户

010-jdk1.8版本新特性二-Optional类,Stream流

1.5.Optional类 1.定义 Optional 类是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象. Optional 是个容器:它可以保存类型T的值,或者仅仅保存null.Optional提供很多有用的方法,这样我们就不用显式进行空值检测. Optional 类的引入很好的解决空指针异常. 2.声明 以下是一个 java.util.Optional<T> 类的声明: public final class Option

Stream流

Stream流 stream流,是在java8中,由lambda表达式所带来的一种新的函数是编程模式,可以用来解决一些已有的集合类型的弊端. 1.stream流与传统集合的便利方式的区别 传统遍历方式 1 public static void main(String[] args) { 2 //遍历输出名字中含有七的并且名字长度为3的人 3 List<String> list = List.of("乔七七","韩七岁","零零七",&