• 文件流


    其实早就想写一篇关于流的文章了,但是流这个内容比较多,笔者知道的东西也比较少,在网上找了一些人写的关于流的文章,他们写的还不错。其中《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);
                }
            }
        }

     

     

  • 相关阅读:
    Linux_CentOS_6.5安装Nginx
    数据恢复
    Kali Linux渗透测试第二步:漏洞评估
    Django 中的urls 导入
    python django url导入
    SpringMVC之组合注解@GetMapping
    Spring中@Controller和@RestController之间的区别
    Spring中@Autowired注解、@Resource注解的区别
    如何把字符串数组从 Swift 传递给 C
    如何把字符串数组从 Swift 传递给 C
  • 原文地址:https://www.cnblogs.com/dongqinglove/p/3541995.html
Copyright © 2020-2023  润新知