星空网 > 软件开发 > Java

Unreleased Resource(未释放资源)

  java中把不同的输入/输出源(键盘、文件、网络连接等)抽象表现为Stream(流).

java程序可以通过使用不同的流来访问不同的输入/输出源.而Stream(流)可以直观的理解为从数据的源(Source)到数据的接收(Sink)之间的这样一段有序数据.

ps. 注意此处是Stream(流) 并不是 冰激凌中的 Scream(奶油)

大家看以参照下图,在脑海中想象一下,途中的水滴就是流中的数据,他们共同组成了这段有序的数据(水:流)。

 Unreleased Resource(未释放资源)


 

一、流的分类

1、按照流的方向(从程序运行所在的内存的角度来划分)

输入流:只能从流中读取数据,不能向其写出数据.(基类 InputStream, Reader)

输出流:只能向其写出数据,不能从中读入数据(基类OutputStream,Writer)

2、按照操作的数据单元不同

字节流:操作的最小数据单元是字节(8 bit),主要以InputStream、OutputSteam为基类

字符流:操作的最小数据单元是字符(16bit),主要以Reader、Writer为基类

3、按照流的角色分

节点流:可以从/向一个特定的IO设备读写数据的流。这种流属于一种Low level Stream.

这种流往往直接连接到实际(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )的数据源,即和实际的输入输出节点直接连接.

处理流(包装流):用于对已经存在的流进行连接和封装,通过封装后的流来实现数据的读写功能。这种流往往成为高级流。

这种流通过对不同节点流的包装,使得程序可以使用完全相同的输入输出代码来访问不同的数据源。

是一种典型的外观模式。即不改变原有类的使用和继承的情况。通过创建一个包装对象,来包裹真实的数据。此处原有类的使用和继承就是节点流。通过包装流来包裹真实数据,而扩展功能。

 


 

二、流的概念模型

流可以理解为:把输入设备抽象成一个"水管",这个水管中的每个"水滴"依次排序,每一个水滴就可以理解为输入输出的单位(即前文中讲到的字节和字符).这些水滴形成的一个有序序列就是流。

输入流使用隐式的记录指针来表示当前正准备从哪个水滴来开始读取数据。每当程序从 inputStream/Reader 中取出一个或多个"水滴"的时候,记录指针就会自动向后移动。

输出流的话可以理解为在一根已经通向目标的管道边,程序一次把输出的"水滴"防止到需要输出的管道中。

 

这样我们就能理解流除了在内存中分配空间,还要占用操作系统的资源。

下面来看个例子

 

 1 public class TempStreamModle 2 { 3   public static void main(String[] args) 4   { 5     PrintStream ps= null; 6     try 7     { 8       ps=new PrintStream(new FileOutputStream("out.txt"));// 创建输出流 9       System.setOut(ps);//将输出的流指定到ps流10       System.out.println("common String");11       System.out.println(new TempStreamModle());12     }13     catch(IOException ex)14     {15       //solve error16     }17     finally18     {19       if(ps!=null)20       {21         ps.close();22       }23     }24   }25 }

 

Java的GC 只能回收jvm中不使用的对象,对操作系统分配的其他资源无法进行回收。所以需要我们主动的调用close()

调用close()方法的好处是:

(1)保证流占用的物理资源可以被释放

(2)将输出流缓冲中的数据flush(冲洗)到物理节点里。相当于主动执行了flush()方法。

 

PS. Java在使用流时,一般都会有一个缓冲区,按一种它认为比较高效的方法来发数据:应用程序每次IO都要和设备进行通信,效率很低,因此缓冲区为了提高效率,当写入设备时,会先写入缓冲区,等到缓冲区有足够多的数据(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )时,就整体写入设备(注意绘制GUI界面时,也是使用此种思路来保证界面在绘制或者拖动时不发生闪动)。而flush()表示强制将缓冲区中的数据发送出去,不必等到缓冲区满再执行。所以如果在用流的时候,如果没有用flush()这个方法,很多情况下会出现流的另外一侧读不到数据的问题,特别是在数据非常小的情况下。

这就相当于旅游区的景点观光车一样,人满才会发车(flush),但是当下班时,无论最后一班车里有多少人,都会发最后一班车,而不会等到车满(缓冲区满)。

Unreleased Resource(未释放资源)

 




原标题:Unreleased Resource(未释放资源)

关键词:

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

精准挖掘关键词,店铺流量轻松拿捏!:https://www.kjdsnews.com/a/778467.html
跨境电商今年还有黑科技吗?2022跨境电商该如何运营:https://www.kjdsnews.com/a/778468.html
SEO的诱人误区:搜索量问题解读:https://www.kjdsnews.com/a/778469.html
多渠道布局下,卖家如何转换思路挖掘日本市场商机?:https://www.kjdsnews.com/a/778470.html
Shopee客服工作细则攻略,助力店铺运营:https://www.kjdsnews.com/a/778471.html
震惊!该外贸网站的用户体验居然达到了100分!:https://www.kjdsnews.com/a/778472.html
三亚有哪些酒店值得入住?:https://www.vstour.cn/a/366173.html
零售晚报:丽人丽妆2023年扭亏为盈 玉容初、美壹堂等自有品牌增速超40% :https://www.kjdsnews.com/a/1836649.html
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流