.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();
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();
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);
//使用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();
}
}
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。
{
操作
}
//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(); //每次返回一个字符串
streamwriter sw =new streamwriter(@"target",true,encoding.getenconding("gb2312"));
sw.writeline("helloworld");
//按行读取
streamreader sr =new streamreader(@"source");
sr.readerline(); //每次返回一个字符串
希望本文所述对大家的.net程序设计有所帮助。