当前位置: 移动技术网 > IT编程>开发语言>.net > .NET中的IO操作之文件流用法分析

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

2017年12月12日  | 移动技术网IT编程  | 我要评论

重生之傻妻训夫,额去鲁,u8i拆机

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网