(69)C# 流

 

一、Stream 

stream是一个所有流抽象类,流S字节序列的抽象

 

 

二、文件流 FileStream

 https://www.cnblogs.com/buchizaodian/p/6607422.html

 

 

 

三、流适配器

1.文本适配器

用来读取和写入字符的读取器 抽象类 TextReader和TextWriter

TextReader

TextWriter

 

StreamReader 和StreamWriter默认使用utf-8的编码进行操作,也可以知道传入的编码格式StreamReader(Stream, Encoding)

StreamReader 可以获取一个路径

StreamReader(String)

也可以获取的stream

StreamReader(Stream)

 

读取--都有异步的方法

可以按字符读取

Read(Char[], Int32, Int32)

 

可以按行读取

ReadLine()

 

可以一口气读全部

ReadToEnd()

 

判断是否到达末尾

                while (sr.Peek() > -1) 
                {
                    Console.WriteLine(sr.ReadLine());
                }

返回光标下次指向的字符,下次是末尾的话,返回-1

或者read方法返回null

            while (stream.ReadLine()!=null)
            {

            }

 

2.二进制适配器

 BinaryReader 类 BinaryWriter 类

3.xml适配器

提供一种快速、非缓存和只进方式读取或生成xml数据流或文件

 XmlReader 类 XmlWriter类   (另 XmlTextReader 类  XmlTextWriter 类官方不建议使用)

4.关闭和销毁流适配器

有四种方式

(1).只关闭适配器

(2).关闭适配器,而后关闭流

            //嵌套语句有内向外先关闭适配器,后关闭流
            using (FileStream fs = File.Create("text.txt"))
            using (StreamWriter textWriter=new StreamWriter(fs))
            {
                textWriter.WriteLine("abc");
            }

(3).对于写入器,先刷新适配器,再关闭流

(4).对于读入器,直接关闭流 

四、管道流  PipeStream 类

它是一个抽象类用来进行本地进程之间或者网络进程之间的通信,

 

 

1.匿名管道

匿名管道在本地计算机上提供进程间通信。 与命名管道相比,虽然匿名管道需要的开销更少,但提供的服务有限。 

匿名管道是单向的,不能通过网络使用。 仅支持一个服务器实例。 

匿名管道可用于线程间通信,也可用于父进程和子进程之间的通信,因为管道句柄可以轻松传递给所创建的子进程

可通过使用 AnonymousPipeServerStream 和 AnonymousPipeClientStream 类来实现匿名管道

服务端

            Process clientProcess = new Process();
          
            clientProcess.StartInfo.FileName = @"C:\Users\ClientPipe.exe";
            //
            using (AnonymousPipeServerStream pipeServer =
                new AnonymousPipeServerStream(PipeDirection.Out,HandleInheritability.Inheritable))
            {
                clientProcess.StartInfo.Arguments = pipeServer.GetClientHandleAsString();
                clientProcess.Start();

                /*
                将DisposeLocalCopyOfClientHandle客户端句柄传递到客户端之后, 应调用方法。
                如果未调用此方法, AnonymousPipeServerStream则对象在客户端释放其PipeStream对象时不会收到通知
                 */
                //pipeServer.DisposeLocalCopyOfClientHandle();
                try
                {
                    using (StreamWriter sw = new StreamWriter(pipeServer))
                    {
                        sw.AutoFlush = true;
                        while (true)
                        {
                            sw.WriteLine(Console.ReadLine());
                        }
                    }
                }
                catch (IOException e)
                {
                    Console.WriteLine("[服务端] Error: {0}", e.Message);
                }
            }

            //clientProcess.WaitForExit();
            //clientProcess.Close();
            Console.WriteLine("[服务端] Client 退出");
            Console.ReadLine();

客户端

            if (args.Length > 0)
            {
                using (PipeStream pipeClient =
                    new AnonymousPipeClientStream(PipeDirection.In, args[0]))
                {
                    using (StreamReader sr = new StreamReader(pipeClient))
                    {
                        string temp;
                        while ((temp = sr.ReadLine()) != null)
                        {
                            Console.WriteLine("[客户端] 显示: " + temp);
                        }
                    }
                }
            }
            Console.ReadLine();

运行服务端

2.命名管道

命名管道在管道服务器和一个或多个管道客户端之间提供进程间通信。 

命名管道可以是单向的,也可以是双向的。

它们支持基于消息的通信,并允许多个客户端使用相同的管道名称同时连接到服务器进程。 

命名管道还支持模拟,这样连接进程就可以在远程服务器上使用自己的权限。

可通过使用 NamedPipeServerStream 和 NamedPipeClientStream 类来实现命名管道

程序例子:只能传送一个字节

客户端

        public static void Main()
        {
            Console.WriteLine("客户端:");
            using (var clientPipe=new NamedPipeClientStream("pipe"))
            {
                clientPipe.Connect();
                int a = clientPipe.ReadByte();
                Console.WriteLine(a);
            }
            Console.ReadKey();
        }

服务端

        public static void Main(string[] args)
        {
            Console.WriteLine("服务端:");
            using (var serverPipe=new NamedPipeServerStream("pipe"))
            {
                serverPipe.WaitForConnection();
                serverPipe.WriteByte(100);
            }
            Console.ReadKey();
        }

 

五、网络流 NetworkStream

 

六、装饰器流 BufferedStream

 

七、内存流

 

 八、压缩流

 

 

posted @ 2020-01-01 09:04  富坚老贼  阅读(533)  评论(0编辑  收藏  举报