zoukankan      html  css  js  c++  java
  • .NET中的IO操作之文件流(一)

    读操作
    //1.创建文件流
    FileStream fsRead =new FileStream("1.txt",FileMode.Open);
    //2.创建缓冲区,正常情况下,是不会直接等于文件大小的。这里只有读,所以就这么干了。
    byte[] bytes =new byte[fsRead.Length];
    //3.开始读取, 返回值是读取到的长度。
    int r =fsRead.Read(bytes,0,bytes.Lenght);
    //4.关闭释放流
    fsRead.Close();
    fsRead.Dispose();
    写操作
    //1.创建写入的文件流
    FileStream fsWrite fsWrite =new FileStream(@"xxx",FileMode.OpenOrCreate);
    //2.创建缓冲区
    String msg ="HelloWorld";
    byte[] bytes =Enconding.UTF8.GetBytes(msg);
    //3.开始写入
    fsWrite.Write(bytes,0,bytes.Length);
    //4.关闭
    fsWrite.Close();
    fsWrite.Dispose();
    byte数组与string之间的转换
    /*在文件流写入的时候,经常需要string 和 byte数组之间的转换。
       这里简单的描述一下,这方面的做法。*/
    1.stringbyte[]数组。
    string msg ="HelloWorld";
    //使用UTF8编码
    byte[] bytes =System.Text.Encoding.UTF8.GetByte(msg);
    //使用系统默认编码
    byte[] bytes =System.Text.Encoding.Default.GetByte(msg);
     
    2.byte[]到string
    string newMsg =System.Text.Encoding.UTF8.GetString(bytes);
    编码问题
    为什么中文会乱码?
    UTF8 编码中,一个中文字符占用两个字节。
    GBK  编码中,一个中文字符占用三个字节。
    UTF8 编码中,用两个字节保存一个汉字,如果你用GBK读取,按照三个字节一个字的格式去读。当然乱码了。反之也是一样的。
    总结起来,无论是36码的鞋子,穿在50码的脚丫子上。还是36码的脚丫子,穿50码的鞋。看起来都不会很舒服。
    所以,按照什么格式写入,就按照什么格式读取。才是正解。
    
    PS:1.Utf8是国际标准。
         2.GB2312  是国标编码,支持中文的。
         3.GBK是对GB2312的扩展,支持繁体中文。
    什么类可以Dispose( )?
    1.Dispose()表示释放资源,.NET中对Dispose()有一个统一的约定或者叫描述。这个约定表现为一个接口。
    或者说这个接口,是一个红头文件,红头文件中约定了如何释放资源。
    所有实现了IDisposable接口的类都可以释放,可以Dispose();
    那么类库中什么样的类会实现IDisposable接口呢?
    我的理解是这样的,一般仅占用托管堆中内存资源的类或对象。一般不需要Dispose()。垃圾回收就搞定了。
    但是对于,文件句柄,网络端口号,数据库连接等,CLR的垃圾回收机制是不管的。
    所以一般这部分内容需要实现IDisposable接口。
    文件流操作的异常处理
    //只有把fs定义在这里,finally中才能引用得到。
    FileStream fs =null;
    try
    {
         fs =new FileStream(@"文件路径",FileMode.Create);
         byte[] bytes = Encoding.Default.GetBytes("HelloWorld");
         fs.Write(bytes,0,byte.Length);
    }
    finally
    {
         if(fs != null)  //如果fs未赋值,那么直接Dispose就会引发空指针异常。
         {
             fs.Dispose();
         }
    }
    简化上述的写法,虽然严谨但是稍微有点麻烦。Microsoft提供了语法糖。
    就是using的语法
    using(某个可以释放资源的类)
    {
          操作
    }
    //1.操作执行完,会自动释放。
    //2.using语句编译完成以后,会形成跟上面类似的代码。就是使用try  finally。
    StreamWriter和StreamReader
    //按行写入
    StreamWriter sw =new StreamWriter(@"target",true,Encoding.GetEnconding("GB2312"));
    sw.WriteLine("HelloWorld");
     
    //按行读取
    StreamReader sr =new StreamReader(@"Source");
    sr.ReaderLine();  //每次返回一个字符串

    来源:http://www.cnblogs.com/mcad/p/4205093.html

  • 相关阅读:
    Python批量修改文件后缀脚本
    IOS开发(62)之GCD上异步执行非UI任务
    创业遐想:三千世界 致在桥上看风景的你
    院长谈读书的方法(部门图书互换活动)
    树形dp hdu4514 湫湫系列故事——设计风景线
    设计模式之strategy模式(C++实现)
    拿什么拯救你,我的大规模杀伤性武器Nokia!
    C++成员函数的重载,继承,覆盖和隐藏
    ORA00600: internal error code, arguments: [4194] ,ORA00607
    wing ide 4.0/4.1超简单破解方法
  • 原文地址:https://www.cnblogs.com/xiaoyaodijun/p/4350784.html
Copyright © 2011-2022 走看看