为什么每次下载后必须关闭掉IO流?

读一个文件,忘记关闭了流,你在操作系统里对这个文件的写,删除等操作就会报错,告诉你这个文件被某个进程占用,这是为什么呢?

  java是从c++设计来的,但是无论是C语言还是C++,都需要手动释放内存,java不需要。

  因为java在对象的引用被消除之后,正常情况下,内存资源是会被垃圾回收。

  使用完IO流,必须手动回收,这是为了回收系统资源。

  一般来说,需要自己close的东西,都是用了虚拟机之外的资源,例如端口,显存,文件等,虚拟机无法通过垃圾回收释放这些资源,只能显式调用close方法来释放。比如释放占用的端口,文件句柄,网络操作数据库应用等。

一般来说,IO操作的底层就是这个步骤进行实现的,只要存在读写操作,无论使用到的是缓存IO,文件IO,还是块IO,都是需要和计算机内文件打交道的。清理计算机硬件上面的垃圾,虚拟机的本职能就没有这个任务。

gc()有下面的特性:

1)gc只能释放内存资源,而不能释放与内存无关资源。

  2)gc回收具有不确定性,你根本不知道它什么时候会回收。

而对于需要程序员手动回收的资源往往具有这样的特点:

  1)资源开销大,不用需要立即释放;

  2)资源是系统唯一的,不释放会导致别的程序也无法使用该资源。

  也就是说,对于具有这些特点的资源就必须保证不使用后能够立即释放出这部分资源,而不能把这么重要的事情交给一个具有不确定性不靠谱的gc来完成。

原文地址:https://www.cnblogs.com/vole/p/12653631.html

时间: 2024-10-12 19:24:50

为什么每次下载后必须关闭掉IO流?的相关文章

黑马程序员——java IO流

java中,IO流需要操作系统资源,使用完毕后要释放资源. IO流根据操作的数据的类型的不同,可以分为字节流和字符流, 字符流是基于字节流的. 字符流的顶层基类是Reader和Writer 字节流的顶层基类是InputStream和OutputStream 流是用来操作数据的,数据的最常见形式是文件,字符流针对的是文本文件,字节流针对的是二进制文件(如图片文件). 1.FileWriter是Writer的一个子类,创建FileWriter对象后,如果源文件不存在则创建新文件:如果源文件存在则覆盖

Java IO流读写文件的几个注意点

平时写IO相关代码机会挺少的,但却都知道使用BufferedXXXX来读写效率高,没想到里面还有这么多陷阱,这两天突然被其中一个陷阱折腾一下:读一个文件,然后写到另外一个文件,前后两个文件居然不一样? 解决这个问题之后,总结了几个注意点. 注意点一:Reader/Writer读写二进制文件是有问题的 : public void copyFile1() { File srcFile = new File("E://atest//atest.txt"); File dstFile = ne

191108、Java IO流读写文件的几个注意点

平时写IO相关代码机会挺少的,但却都知道使用BufferedXXXX来读写效率高,没想到里面还有这么多陷阱,这两天突然被其中一个陷阱折腾一下:读一个文件,然后写到另外一个文件,前后两个文件居然不一样? 解决这个问题之后,总结了几个注意点. 注意点一:Reader/Writer读写二进制文件是有问题的 : 上面代码使用BufferedReader一行一行地读取一个文件,然后使用BufferedWriter把读取到的数据写到另外一个文件中.如果文件是ASCCII形式的,则内容还是能够正确读取的.但如

Java——(九)IO流

一.流的分类 输入流和输出流 按照流的流向来分,可以分为输入流和输出流 输入流:只能从中读取数据,而不能向其写入数据. 输出流:只能向其写入数据,而不能从中读取数据. 此处的输入.输出涉及一个方向的问题,数据从内存到硬盘,通常称为输出流.(即这里的 输入.输出都是从程序运行所在内存的角度来划分的).Java的输入流主要由InputStream和 Reader作为基类,而输出流则要由OutputStream和Writer作为基类.它们都是一些抽象基类 ,无法直接创建实例. 字节流和字符流 字节流和

Java socket中关闭IO流后,发生什么事?(以关闭输出流为例)

声明:该博文以socket中,关闭输出流为例进行说明. 为了方便讲解,我们把DataOutputstream dout = new DataOutputStream(new BufferedOutputStream(mySocket.getOutputStream()));中的dout做为Socket输出流的代言.同样的,din是输入流的代言. 可以造成dout被关闭的操作有: 1.调用dout.close();或din.close();因为使用这种流关闭,会造成socket被关闭,所以输入输出

一家VC支持企业的发展轨迹——了解每次融资后股权的变化,以及股份是如何被稀释的【转载】

来源:ReachVc 如果你是一个不太了解融资的创业者,那么本文将对你很有用.通过武林外传同福客栈的例子,了解每次融资后股权的变化,以及股份是如何被稀释的. 话说,在闻名天下的关中七侠镇,有个叫做吕轻侯的创业者,他是个知识分子--落难秀才,因为找不到工作,所以在七侠镇镇政府的鼓励下开始创业,开了一家客栈--同福客栈.但由于客栈只提供单一的客房服务,再加上吕秀才自身的工作能力也不足,而且团队严重短缺--就他自己一个人,所以生意很一般,都快要关门大吉了.当然,作为这家创业公司的唯一创始人及员工,吕秀

java io流(字符流) 文件打开、读取文件、关闭文件

java io流(字符流) 文件打开 读取文件 关闭文件 //打开文件 //读取文件内容 //关闭文件 import java.io.*; public class Index{ public static void main(String[] args) throws Exception{ //打开文件 //字符流方式打开 //字符流每次按一个字符读取 FileReader wj = new FileReader("D:/java/kj/javanew/src/Index.java"

io流的关闭顺序

一般情况:先打开的后关闭,后打开的先关闭: 另一种情况:看依赖关系,如果流a依赖流b,应该先关闭流a,再关闭流b. FileWriter fw = new FileWriter( "E:/data//车站一次.csv",true); BufferedWriter bufw = new BufferedWriter(fw); 关闭流(注意顺序): bufw.close(); fw.close(); 此处用BufferedWriter来包装FileWriter,所以应该先关闭bufw,然后

Java IO流关闭问题的深入研究

转自:https://blog.csdn.net/maxwell_nc/article/details/49151005 前几天看了一篇文章(见参考文章),自己动手试了下,发现有些不一样结论,作博客记录下,本文主要研究两个问题: 包装流的close方法是否会自动关闭被包装的流?关闭流方法是否有顺序?包装流的close方法是否会自动关闭被包装的流?平时我们使用输入流和输出流一般都会使用buffer包装一下, 直接看下面代码(这个代码运行正常,不会报错) 1 import java.io.Buffe