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

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

ps. 注意此处是Stream(流) 并不是 那款常喝的运动饮料的Scream(尖叫)   也不是冰激凌的奶油 Cream

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


一、流的分类

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 中取出一个或多个"水滴"的时候,记录指针就会自动向后移动。

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

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

下面来看个例子

 public class TempStreamModle
{
public static void main(String[] args)
{
PrintStream ps= null;
try
{
ps=new PrintStream(new FileOutputStream("out.txt"));// 创建输出流
System.setOut(ps);//将输出的流指定到ps流
System.out.println("common String");
System.out.println(new TempStreamModle());
}
catch(IOException ex)
{
//solve error
}
finally
{
if(ps!=null)
{
ps.close();
}
}
}
}

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

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

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

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

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

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

Unreleased Resource(未释放资源)-Streams(流)的更多相关文章

  1. Fortify Audit Workbench 笔记 Unreleased Resource: Database( 未释放资源:数据库)

    Unreleased Resource: Database 未释放资源:数据库 Abstract 程序可能无法成功释放某一项系统资源. Explanation 程序可能无法成功释放某一项系统资源. 资 ...

  2. STREAMS流机制

    STREAMS流机制 基本概念 STREAMS(流)是系统V提供的构造内核设备驱动程序和网络协议包的一种通用方法,对STREAMS进行讨论的目的是为了理解系统V的终端接口,I/O多路转接中poll(轮 ...

  3. Kafka Streams | 流,实时处理和功能

    1.目标 在我们之前的Kafka教程中,我们讨论了Kafka中的ZooKeeper.今天,在这个Kafka Streams教程中,我们将学习Kafka中Streams的实际含义.此外,我们将看到Kaf ...

  4. oracle数据库基于(streams流复制)的双机热备配置手册

    ------------------------------------------------------------------------------- 主数据库: 操作系统:windows 2 ...

  5. 未释放资源的教训,开发MongoDB连接一定要关闭连接

    废不少工夫将数据存储,全部迁移至mongodb,未作大量改动则是主因. 但遇到奇怪的现象. 程序跑起不久后,mongodb即假死,另起客户端想登陆mongodb都不成. 要重启mongodb服务器才好 ...

  6. 【java】学习路径31-文件IO基本操作(未涉及到流)

    一.初始化: File f1 = new File("//Users//Shared//JavaIOTest//Test01.txt"); File f2 = new File(& ...

  7. JavaSE复习(四)File类与IO流

    File类 构造方法 public File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例. public File(String parent ...

  8. Java之IO初识(字节流和字符流)

    IO概述 生活中,你肯定经历过这样的场景.当你编辑一个文本文件,忘记了 ctrl+s ,可能文件就白白编辑了.当你电脑上插入一个U盘,可以把一个视频,拷贝到你的电脑硬盘里.那么数据都是在哪些设备上的呢 ...

  9. File流与IO流 看这一篇就够了

    主要内容 File类 递归 IO流 字节流 字符流 异常处理 Properties 缓冲流 转换流 序列化流 打印流 学习目标 [ ] 能够说出File对象的创建方式 [ ] 能够说出File类获取名 ...

随机推荐

  1. PHP两个文件的相对路径

    /** * relativePath 计算两个文件的相对路径 * @param file1 参作为考路径 * @param file2 相对于$file1的路径 */ function relativ ...

  2. oracle在cmd中启动数据库实例

    在cmd中启动数据库实例: sqlplus /nolog 回车, conn as sysdba;回车,startup;然后回车

  3. 新手程序员随笔2——初识html、css和javascript

    翻看博客,发现好久木有发blog了.纠其原因,一则是近来工作上卡到了一个编程难题,我是一个单线程的小猿,当我手头有事情做的时候,我不想分心去做其它事情,如写blog.二则是我个人的写作能力不佳,想到写 ...

  4. Java虚拟机各内存区域的位置及功能的介绍

    Java虚拟机运行时数据区: 相关区域介绍: 程序计数器: 功能:当前线程所执行字节码的行号指示器.若是Java方法记录指令地址,若为Native方法,则不记录 隔离性:线程隔离 Error:无 Ja ...

  5. Android端接收和发送cookie

    流程: 首先android端使用HttpClient的方式发送HTTP请求,此时服务器创立cookie,并发送cookie给android端,android端再将cookie保存起来,在需要发送coo ...

  6. windows php 5.5 执行exe 不是有效的win32程序

    双击运行php-cgi.exe弹出对话框提示不是有效的win32应用程序.此为版本问题,PHP5.5版本 最低要运行于操作系统版本号最低要6.0 ,而WINDOWS 2003 系统为5.2 因此无法运 ...

  7. C#枚举类型

    枚举是一个指定的常数,其基础类型可以是除 Char 外的任何整型.如果没有显式声明基础类型,则使用 Int32. 定义 默认基数从0开始,也可指定数值. enum Days { Saturday, / ...

  8. equals和==的区别

    ---恢复内容开始--- equals:用于判断两个变量是否是对同一个对象的引用,即堆中的内容是否相同. 1.第一:对象不同,内容相同: ==:等于.比较两个地址是不是一样的(地址一样值肯定一样)(比 ...

  9. python类型转换

    1.数字转字符串 str(42) == "42" 2.字符串转数字 int("42") == 42 3.字符转ascii码 ord("a") ...

  10. escape,encodeURI,encodeURIComponent的区别

    escape是对字符串进行编码而另外两种是对URL. encodeURI方法不会对下列字符编码 ASCII字母 数字 ~!@#$&*()=:/,;?+'encodeURIComponent方法 ...