.net中close和dispose及关闭流操作
之前打开文件流后总不记得关闭流,昨天终于出现问题了,因此上网搜了一下,下面是实际操作和网上搜索后的记录:
1.关闭流的顺序一般为后开先关,如
Image img = Image.FromFile("file.jpg");
MemoryStream ms = new MemoryStream();
img.Save(ms, ImageFormat.Jpeg);
ms.Close();
ms.Dispose();
img.Dispose();
其实不用如此。因为是深拷贝,所以ms和img之间已经没有联系了,两个对象是以不同的形式操作同一个文件,所以先关闭哪一个都没关系。下面的例子可以证 明一个对象关闭了,而另一个对象依然可以操作该文件。注意这两个对象属于同一个进程来操作文件,所以不会产生IOException。
Image img = Image.FromFile("file.jpg");
MemoryStream ms = new MemoryStream();
img.Save(ms, ImageFormat.Jpeg);
img.Dispose();
context.Response.OutputStream.Write(ms.GetBuffer(), 0, (int)ms.Length);
ms.Close();
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关闭(就是程序关闭)。
.net中close和dispose及关闭流操作相关推荐
- Java中使用try-with-resource优雅的关闭io流
前言 最近看到一篇关于串流的关闭方法,通过编译器自动生成关闭串流源码,行之有效. 转载自博主: Java劝退师. https://blog.csdn.net/qq_41389354/article/d ...
- zipfile中怎么关闭流_深入学习JAVA -IO流详解
(一)IO流基本概念 Java对数据的操作是通过流的方式,io是java中实现输入输出的基础,它可以很方便的完成数据的输入输出操作,Java把不同的输入输出抽象为流,通过流的方式允许Java程序使用相 ...
- java8 流操作_java8中的流操作
Stream 流是 Java 8 新提供给开发者的一组操作集合的 API,将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选.排序.聚合等.元素流在管道中经过 ...
- try catch finally 关闭流标准的写法
平常开发中,都知道要在finlly里关闭流,但是有时finlly里代码不当,会引起另外的异常. 以下是看struts2源代码看到的,随手记录下. 有两点注意: (1)判断流是否为空. (2)f ...
- java中什么方法用来清空流_这个真的写的很细,JavaIO中的常用处理流,看完只有10%的人还不懂了...
JavaIO中的常用处理流 在前面,我们了解了有关JavaIO流基础的使用,其中对于IO流来说最基础的四大基类就是InputStream.OutputStream.Reader.Writer.而我们对 ...
- 细节打满,IO 操作必须手动关闭?关闭流方法是否有顺序?
点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/maxwell_nc/article/ details/49151005 前几天看了一篇文章,自己动手试了下,发现有些不一样结论 ...
- java中什么是字节流和字符流_java中字节流与字符流的区别是什么
字节(Byte)是进行io操作的基本数据单位,在程序进行字节数据输出时可以使用OutputStream类完成 此类定义如下: public abstract class OutputStream ex ...
- java中printreader类_Java基本字符流输入输出类的使用
1. 基本字符输入输出类结构 Java基本字符流类结构 2. 抽象父类:Writer & Reader Writer类 public abstract class Writer extends ...
- android java写文件_Android中文件的读写(一)----流操作
因为自己的Java基本功不扎实,所以这篇文章主要介绍Java中的流操作,让自己再学习一下. Java IO Java IO中用于读写文件的四个抽象类:Reader,Writer,InputStream ...
最新文章
- Matlab与线性代数 -- 方阵的行列式
- (pytorch-深度学习系列)pytorch卷积层与池化层输出的尺寸的计算公式详解
- Tensorflow Lite之编译生成tflite文件
- win32 api 文件操作!
- SpringDataRedis的简单案例使用
- Win10系统配置Python3.6+OpenGL环境详细步骤
- Python自动化办公 | 补写178份Word日报!
- 三步教会你在solidworks中画铝型材
- BSD许可协议具体限制了什么?
- thinkpad重装系统步骤
- 大数据文本相似去重方案
- ansible管理变量、机密和事实
- 快速申请注册微信小程序的方法
- 逆波兰式 java_逆波兰式(后缀表达式)的计算 中缀表达式转后缀表达式(逆波兰式)【java实现】...
- 记在拿到cvte的offer之后
- Vue实现省、市、县三级联动
- 修改演武今日可用数据显示
- 【渝粤教育】电大中专电子商务网站建设与维护 (29)作业 题库
- 计算机丢失libjcc dll,libjcc.dll 64位
- 7-8 整数四则运算 (10分)
热门文章
- 未老先呆,这锅熬夜真的要背:生物钟影响阿尔茨海默症的机制被发现
- 对话高通孟樸:5G发展离不开中国,高通坚定pick全球化
- 电力系统【第3章:简单电力系统的潮流分布计算】
- 歌词数据解析、歌词滚动、歌词进度控制功能的实现(基于js-base64、lyric-parser、better-scroll),以vue项目为例...
- MySQL在ROW模式下通过binlog提取SQL语句
- C++转义字符 amp; keyword
- js控制select大全
- 处理字符数据--运算符和函数
- Eclipse调试Debug技巧
- perl 取出目录中的所有文件并存入文件中