NET 中system.IO(Stream) 的学习笔记一

什么是Stream?

MSDN 中的解释太简洁了: 提供字节序列的一般视图

那什么是字节序列呢?

其实简单的来理解的话字节序列指的是:

字节对象都被存储为连续的字节序列,字节按照一定的顺序进行排序组成了字节序列

那什么关于流的解释可以抽象为下列情况:

比如:一条河中有一条鱼游过,这个鱼就是一个字节,这个字节包括鱼的眼睛,嘴巴,等组成8个二进制,显然这条河就是我们的核心对象:流

换一种方式来说明

流是抽象的概念,可以把流看作是一种数据的载体,通过它可以实现数据交换和传输。如文件的操作,输入/输出设备,内部进行通信的管道

我们来看看流的结构图。

上图就是他的结构图滴,接下来,我们就继续详细解答。

1.Stream,TextReader,TextWriter类都是抽象类。

2.Stream,TestReader,TestWriter,BinaryReader,BinaryWriter类都继承了IDisposable借口,所以在使用完之后,记得关闭流。 

3.把流中数据加载到内存时要考虑内存溢出等问题(有待研究)

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

5.MemoryStream类: 主要用于操作内存中的数据。比如说网络中传输数据时可以用流的形式,当我们收到这些流数据时就可以声明MemoryStream类来存储并且处理它们。

6.BufferedStream类:主要也是用来处理流数据的,但是该类主要的功能是用来封装其他流类。为什么要封装其他流类,这么做的意义是什么?按照微软的话说主要是减少某些流直接操作存储设备的时间。对于一些流来说直接向磁盘中存储数据这种做法的效率并不高,用BufferedStream包装过的流,先在内存中进行统一的处理再向磁盘中写入数据,也会提高写入的效率。

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

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

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

接下来,我们看具体的代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace StreamLine001
{
    class Program
    {
        static void Main(string[] args)
        {
            //掌握它常用的各种方法滴呀;
            //还是需要我们一步一步的操作滴呀;
            //c#中byte 和 string之间的转换滴呀;

            byte[] buffer = null;

            string testString = "Stream!Hello World!";
            char[] readCharArrary = null;
            byte[] readBuffer = null;
            string readString = string.Empty;
            
            using(MemoryStream stream=new MemoryStream ())
            {//后面还可以关注一些idisposal接口的知识滴呀;

                if (stream.CanWrite)
                {
                    buffer = Encoding.Default.GetBytes(testString);
                    Console.WriteLine(stream.Position); //小标是从0开始滴呀;
                    stream.Write(buffer,0,3); //这个是写到内存中去滴呀;(只写三个自节)
                    //当指定为3 的时候,实际上是第4的位置
                    Console.WriteLine("现在Stream.Postion在第{0}位置",stream.Position+1);

                    long newPosition=stream.CanSeek?stream.Seek(3,SeekOrigin.Current):0;

                    Console.WriteLine("重新定位后的Stream.Postion在第{0}位置",newPosition+1);
                    if (newPosition < buffer.Length)
                    {
                        //再新的位置开始写入
                        stream.Write(buffer,(int)newPosition,buffer.Length-(int)newPosition);
                    }
                    
                    //然后将stream.Postion中的位置设置为0
                    stream.Position = 0;

                    //设置一个空的盒子俩接受 长度为stream的长度的
                    readBuffer=new byte[stream.Length];

                    int count=stream.CanRead?stream.Read(readBuffer,0,readBuffer.Length):0;

                    //这里还需要一些Encoding方面的知识滴呀;
                    int charCount = Encoding.Default.GetCharCount(readBuffer,0,count);

                    readCharArrary=new char[charCount];

                    Encoding.Default.GetDecoder().GetChars(readBuffer,0,count,readCharArrary,0);

                    for (int i = 0; i < readCharArrary.Length; i++)
                    {
                        readString += readCharArrary[i];

                    }
                    Console.WriteLine("字符串的为{0}",readString);
                  
                }
                stream.Close();
            }
            Console.ReadLine();
 
        }
    }
}

字符编码问题

在System.Text命名空间下可以找到Encoding类,它表示字符编码的类。Encoding类

在使用IO操作时,需要涉及到文件字符编码问题。

参考文献:http://www.cnblogs.com/JimmyZheng/archive/2012/03/17/2402814.html

              http://www.cnblogs.com/Johnny_Z/archive/2011/09/12/2174148.html

原文地址:https://www.cnblogs.com/mc67/p/4863572.html