欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-02-22 10:57:10
本文实例讲述了.net中的io操作之文件流用法。分享给大家供大家参考。具体分析如下: 读操作 复制代码 代码如下://1.创建文件流 filestream fsrea...

本文实例讲述了.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程序设计有所帮助。