之前打开文件流后总不记得关闭流,昨天终于出现问题了,因此上网搜了一下,下面是实际操作和网上搜索后的记录:

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及关闭流操作相关推荐

  1. Java中使用try-with-resource优雅的关闭io流

    前言 最近看到一篇关于串流的关闭方法,通过编译器自动生成关闭串流源码,行之有效. 转载自博主: Java劝退师. https://blog.csdn.net/qq_41389354/article/d ...

  2. zipfile中怎么关闭流_深入学习JAVA -IO流详解

    (一)IO流基本概念 Java对数据的操作是通过流的方式,io是java中实现输入输出的基础,它可以很方便的完成数据的输入输出操作,Java把不同的输入输出抽象为流,通过流的方式允许Java程序使用相 ...

  3. java8 流操作_java8中的流操作

    Stream 流是 Java 8 新提供给开发者的一组操作集合的 API,将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选.排序.聚合等.元素流在管道中经过 ...

  4. try catch finally 关闭流标准的写法

    平常开发中,都知道要在finlly里关闭流,但是有时finlly里代码不当,会引起另外的异常.  以下是看struts2源代码看到的,随手记录下.  有两点注意:  (1)判断流是否为空.  (2)f ...

  5. java中什么方法用来清空流_这个真的写的很细,JavaIO中的常用处理流,看完只有10%的人还不懂了...

    JavaIO中的常用处理流 在前面,我们了解了有关JavaIO流基础的使用,其中对于IO流来说最基础的四大基类就是InputStream.OutputStream.Reader.Writer.而我们对 ...

  6. 细节打满,IO 操作必须手动关闭?关闭流方法是否有顺序?

    点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/maxwell_nc/article/ details/49151005 前几天看了一篇文章,自己动手试了下,发现有些不一样结论 ...

  7. java中什么是字节流和字符流_java中字节流与字符流的区别是什么

    字节(Byte)是进行io操作的基本数据单位,在程序进行字节数据输出时可以使用OutputStream类完成 此类定义如下: public abstract class OutputStream ex ...

  8. java中printreader类_Java基本字符流输入输出类的使用

    1. 基本字符输入输出类结构 Java基本字符流类结构 2. 抽象父类:Writer & Reader Writer类 public abstract class Writer extends ...

  9. android java写文件_Android中文件的读写(一)----流操作

    因为自己的Java基本功不扎实,所以这篇文章主要介绍Java中的流操作,让自己再学习一下. Java IO Java IO中用于读写文件的四个抽象类:Reader,Writer,InputStream ...

最新文章

  1. Matlab与线性代数 -- 方阵的行列式
  2. (pytorch-深度学习系列)pytorch卷积层与池化层输出的尺寸的计算公式详解
  3. Tensorflow Lite之编译生成tflite文件
  4. win32 api 文件操作!
  5. SpringDataRedis的简单案例使用
  6. Win10系统配置Python3.6+OpenGL环境详细步骤
  7. Python自动化办公 | 补写178份Word日报!
  8. 三步教会你在solidworks中画铝型材
  9. BSD许可协议具体限制了什么?
  10. thinkpad重装系统步骤
  11. 大数据文本相似去重方案
  12. ansible管理变量、机密和事实
  13. 快速申请注册微信小程序的方法
  14. 逆波兰式 java_逆波兰式(后缀表达式)的计算 中缀表达式转后缀表达式(逆波兰式)【java实现】...
  15. 记在拿到cvte的offer之后
  16. Vue实现省、市、县三级联动
  17. 修改演武今日可用数据显示
  18. 【渝粤教育】电大中专电子商务网站建设与维护 (29)作业 题库
  19. 计算机丢失libjcc dll,libjcc.dll 64位
  20. 7-8 整数四则运算 (10分)

热门文章

  1. 未老先呆,这锅熬夜真的要背:生物钟影响阿尔茨海默症的机制被发现
  2. 对话高通孟樸:5G发展离不开中国,高通坚定pick全球化
  3. 电力系统【第3章:简单电力系统的潮流分布计算】
  4. 歌词数据解析、歌词滚动、歌词进度控制功能的实现(基于js-base64、lyric-parser、better-scroll),以vue项目为例...
  5. MySQL在ROW模式下通过binlog提取SQL语句
  6. C++转义字符 amp; keyword
  7. js控制select大全
  8. 处理字符数据--运算符和函数
  9. Eclipse调试Debug技巧
  10. perl 取出目录中的所有文件并存入文件中