.net中close和dispose及关闭流操作
之前打开文件流后总不记得关闭流,昨天终于出现问题了,因此上网搜了一下,下面是实际操作和网上搜索后的记录:
1.关闭流的顺序一般为后开先关,如
1 Image img = Image.FromFile("file.jpg");
2 MemoryStream ms = new MemoryStream();
3 img.Save(ms, ImageFormat.Jpeg);
4 ms.Close();
5 ms.Dispose();
6 img.Dispose();
其实不用如此。因为是深拷贝,所以ms和img之间已经没有联系了,两个对象是以不同的形式操作同一个文件,所以先关闭哪一个都没关系。下面的例子可以证明一个对象关闭了,而另一个对象依然可以操作该文件。注意这两个对象属于同一个进程来操作文件,所以不会产生IOException。
1 Image img = Image.FromFile("file.jpg");
2 MemoryStream ms = new MemoryStream();
3 img.Save(ms, ImageFormat.Jpeg);
4 img.Dispose();
5 context.Response.OutputStream.Write(ms.GetBuffer(), 0, (int)ms.Length);
6 ms.Close();
7 ms.Dispose();
而如果是其他进程的流操作文件时,之前操作文件的流却没释放所有资源的话,会抛出IOException。
2..NET中有些非托管对象有Close和Dispose,有些只有Dispose,网上有的说Close是Dispose的显式实现,会调用Dispose。不过我曾试过只调用Close然后用另一个进程的试图打开该文件,居然抛出IOException;但如果只调用Dispose就一切正常。然后网上又有说Close只是关闭连接,Dispose是释放相关的所有资源。于是实际操作中存在Close和Dispose的情况下,先调用Close然后再调用Dispose是最保险的做法。
3.之前一直以为非托管资源一定要程序员手动释放资源,但通过这次的机会上网看到资料说像FileStream对象实现了Finalize,里面就释放了非托管对象,当垃圾回收时就会自动释放资源,当然这样效率不高只是防止内存泄露的保底做法。而垃圾回收的发生时间为(1)内存不足的时候(这里还有哪一代区域的内存满了该如何操作的问题,详细请看.Net垃圾回收机制),(2)调用GC.Collect(),(3)程序域关闭就是AppDomain关闭(一个程序可以有多个程序域),(4)CLR关闭(就是程序关闭)。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【LeetCode】旋转数组的最小数字day08
- 【原创】Spring Boot集成Redis的玩法
- 当前页面是否可见
- 【LeetCode】两数之和day09
- 【原创】SpringBoot快速整合Thymeleaf模板引擎
- 【leetCode】打印从1到最大的n位数day10
- 你真的了解Java中的String吗(也太菜了)?
- 【设计模式】变化和不变化的代码进行分离day01
- isObject
- 【leetCode】股票的最大利润day12
- Spring Boot 集成 Druid 监控数据源
- 文本分类实战(八)—— Transformer模型
- 滚动页面
- 安全整数
- 【原创】Spring Boot 集成Spring Data JPA的玩法