.NET中的IO操作之文件流(一)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

.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.操作执⾏完,会⾃动释放。

//ing语句编译完成以后,会形成跟上⾯类似的代码。

就是使⽤try finally。

StreamWriter和StreamReader
//按⾏写⼊
StreamWriter sw =new StreamWriter(@"target",true,Encoding.GetEnconding("GB2312"));
sw.WriteLine("HelloWorld");
//按⾏读取
StreamReader sr =new StreamReader(@"Source"); sr.ReaderLine(); //每次返回⼀个字符串。

相关文档
最新文档