文件流

其实早就想写一篇关于流的文章了,但是流这个内容比较多,笔者知道的东西也比较少,在网上找了一些人写的关于流的文章,他们写的还不错。其中《C# 温故而知新:Stream篇 》7篇还不错,下面把笔者了解到的写出来。

关于流的一些概念性的东西笔者就不介绍了,因为经常用大家多少已经了解了。一些相关的类库比如FileFileInfoPathDirectoryDirectoryInfo类等笔者暂时也不介绍,使用到再说。

  

  

 

文件编码

 

在Windows操作系统中有ANSI编码和Unicode编码之分

ANSI默认的gb2312

    Unicode(两个字节)

    小子头的005f5f00

    大子头

UTF-8

就一个汉字有多种编码可供选择,那么二进制的数据表示就不一样

Encoding类,这个类专门用来表示编码,同时提供格式的转换

Encoding是一个类,它有提供了几个方法

GetEncoding()

GetEncodings()

这个类的对象提供了Get系方法

 

文件编码实例

我们看下以下几个文件的16进制数据:新建一个记事本,输入字母a,文件另存4份选择编码分别为ANSI、Unicode、Unicode big endian、UTF-8。这4份文件里都是存储的是字母a,我们Nodepad++打开,并转换成16进制

    文件对于的编码不同,那文件里存储的二进制就不一样,进而16进制表示也不一样

Encoding,所以我们如果用错误的编码读取,那就找不到对应的字符,就会出现乱码

 

文件流是包含非托管资源

 

    GC不能够完全控制FileStream这个类,需要我们手动的释放托管资源

             fileStream.Close();

             fileStream.Dispose();

 

            实际开发过程中,大量的程序员忘记了Dispose()

 

          using(需要手动释放的资源)

          {

       // 当代码离开using的时候,会自动的调用Dispose

           }

 

理论部分先到这里,接下来是读取写入实例:

 

class Program
    {
        static void Main(string[] args)
        {
            ReadFile();
            WriteFile();
        }

        /// <summary>
        /// 读取文件
        /// </summary>
        public static void ReadFile()
        {
            //1.txt里有中文和英文 编码为gb2312
            using (FileStream fread=new FileStream ("1.txt",FileMode.Open,FileAccess.Read))
            {
                //创建缓存数组
                byte[] buy = new byte[10];
                int count = 0;
                string s=string.Empty;
                while ((count = fread.Read(buy, 0, buy.Length)) > 0)
                {
                    s = Encoding.Default.GetString(buy,0,count);//转码
                    Console.Write(s);
                }
            }
            Console.ReadKey();
        }
        /// <summary>
        /// 写入文件
        /// </summary>
        public static void WriteFile()
        {
            using (FileStream fw=new FileStream ("2.txt",FileMode.Create,FileAccess.Write))
            {
                string s = "abc博客园";
                byte[] by = Encoding.Default.GetBytes(s);//把字符串转换成byte数组
                fw.Write(by,0,by.Length);
            }
        }
    }

 

 

原文地址:https://www.cnblogs.com/dongqinglove/p/3541995.html