(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

 

七、內存流

 

 八、壓縮流

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM