.NET中的IO操作之文件流用法分析

 更新时间:2015年01月06日 09:02:45   投稿:shichen2014  
这篇文章主要介绍了.NET中的IO操作之文件流用法,实例分析了.net对文件流的读写操作及编码转换等问题,具有一定参考借鉴价值,需要的朋友可以参考下

本文实例讲述了.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.string 到 byte[]数组。

复制代码 代码如下:
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();  //每次返回一个字符串

希望本文所述对大家的.net程序设计有所帮助。

相关文章

  • ASP.NET从字符串中查找字符出现次数的具体实现方法

    ASP.NET从字符串中查找字符出现次数的具体实现方法

    今天在一场“特殊的讨论”中引入了一个问题,如何在C#求出字符串中某字符的出现次数,比如求“ADSFGEHERGASDF”中“A”出现的次数
    2013-11-11
  • gridview 行选添加颜色和事件

    gridview 行选添加颜色和事件

    在gridview 列表中,需要添加如下效果,如果经过时变色,移开时还原成以前的颜色,行选中时通过加深色,从而知道选中了哪行
    2014-03-03
  • .net 预处理指令符的使用详解

    .net 预处理指令符的使用详解

    这篇文章主要介绍了.net 预处理指令符的使用详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • 近几天对DataSet的新认识

    近几天对DataSet的新认识

    近几天对DataSet的新认识...
    2007-04-04
  • vs2008最近打开的项目清除方法

    vs2008最近打开的项目清除方法

    vs2008最近的打开的项目,这个功能是挺方便的,不过本人不想看到它,于是乎想要清楚掉他,搜集整理了一些实用操作步骤,感兴趣的你可不要错过了哈
    2013-02-02
  • repeater做删除前弹窗询问实例

    repeater做删除前弹窗询问实例

    这篇文章介绍了repeater做删除前弹窗询问实例,有需要的朋友可以参考一下
    2013-10-10
  • .net core 基于Hangfire+Mysql持久化实现定时任务配置方法

    .net core 基于Hangfire+Mysql持久化实现定时任务配置方法

    这篇文章主要介绍了.net core 基于Hangfire+Mysql持久化实现定时任务配置方法,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07
  • 将datagrid控件内容输出到excel文件

    将datagrid控件内容输出到excel文件

    一个将datagrid控件内容输出到excel文件的demo,感兴趣的朋友可以了解下或许对你学习datagrid控件相关有所帮助
    2006-09-09
  • 解决DropDownList总是选中第一项的方法

    解决DropDownList总是选中第一项的方法

    这篇文章主要介绍了解决DropDownList总是选中第一项的方法,DropDownList下拉框服务器控件是最常用的控件之一,虽然使用方便,但也会出现奇怪的错误,感兴趣的小伙伴们可以参考一下
    2015-10-10
  • Asp.Net Core中WebSocket绑定的方法详解

    Asp.Net Core中WebSocket绑定的方法详解

    WebSocket 是一种在单个 TCP 连接上进行全双工通讯的协议,是建立在TCP上、且独立的协议。下面这篇文章主要给大家介绍了关于Asp.Net Core中WebSocket绑定的方法,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-12-12

最新评论