标题 | .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程序设计有所帮助。 |
随便看 |
|
在线学习网考试资料包含高考、自考、专升本考试、人事考试、公务员考试、大学生村官考试、特岗教师招聘考试、事业单位招聘考试、企业人才招聘、银行招聘、教师招聘、农村信用社招聘、各类资格证书考试等各类考试资料。