Java Stream简介, 流的基本概念
在Javaor .net编程中, 我们经常见到"stream" 这个字眼.
我们大概知道这是个流的意思, 如果看完本文的话, 应该会有1个大概的概念.
一, Java中什么是Stream(流)
1.1 1段输出文件内容到屏幕的代码
假如我们有个需求, 利用Java写1个程序, 将1个硬盘上的文件(/home/gateman/tmp/build.xml)内容输出到屏幕上.
Java的代码如下:
- import java.io.*;
- public class Stream1{
- public static void f() throws IOException{
- FileReader fr = new FileReader("/home/gateman/tmp/build.xml");
- int ch; //not char
- ch = fr.read(); //throws IOEXCEPTION
- while(ch > -1){ //if ch = -1, means got the end of the file
- System.out.printf("%c",(char)ch);
- ch = fr.read(); //throws IOEXCEPTION
- }
- }
- }
上面的代码很简单,
1.首先我们见到代码定义了1个 FileReader 对象fr. 它的某个成员指向了我们要读的文件build.xml.
2.然后多次执行 fr.read()方法, 每执行一次, 将fr.read()打返回结果输出到屏幕. 直到fr.read()的返回值是-1.
这里包括我也许有人会想, 为什么要 read 那么多次啊, 干脆写1个强大的read()方法把文件内容都读过来不就完了吗?
这就是涉及了流的概念.
1.2 搬水的例子
我们来举个例子让大家更加容易理解
问题1:
假如有两个杯子, 其中1个有水, 另1个没有水, 它们的位置都不能移动.
请问有什么方法将有水杯子了的水搬去另1个杯子?
答案很多种, 只需要1个碗, 把水倒进碗里, 然后把碗的水倒进另1个杯子里就ok了.
将这个思路应用到1.1 的例子, 就相当于1个强大的Read()方法把整个文件都读完了.
为什么这样说?
1. 我们可以把有水的杯子看做1个文件, 水相当于文件的内容.
2. 没水的杯子相当于屏幕. 我们就是需要把文件的内容输出到屏幕
3. 中间的碗相当于内存, 把有水的杯子的水倒进碗就是一次过把文件所有内容读入内存啊.
4. 最后把碗的水倒进另1个杯子, 相当于把内存里的内容输出到屏幕.
如下图:
问题貌似解决了, 但是随着这个问题的规模的扩大, 这个方法就不可行了.
例如需要搬运的不是一杯水, 而是把整个个池塘的水运到另一个池塘.
用碗来搬就不符合实际啊.
有人回说, 我一碗一晚的搬总会搬完?
问题是, 那个碗(内存)还可以其他东西, 如果整个内存都用于搬运数据, 那么就导致程序在搬运数据的时间里占用大部分操作系统的内存. 留给其他程序的内存就很少了!
1.3 搬水的例子的另1个解决方法: 管道
假如我们的内存(碗)容量很少, 但是要搬运整个池塘怎么办呢?
其实我们就可以用一条水管接通两个池塘.
管道上有1个按钮, 每按1次那个按钮, 就允许一点水通过管道.
如下图:
结合1.1 的java代码例子
实际上我们已经明白, FileReader fr 这个对象就相当于1条管道, 这个管道有1个按钮 fr.read(), 每执行1次, 就有一点水流(1个字符) 读到内存(注意是内存, 而不是屏幕)!
1.4 本文开始1.1节java代码的分析
我们再看回1.1 的代码.
- FileReader fr = new FileReader("/home/gateman/tmp/build.xml");
当执行碗上面的代码后,
实际上建立了1条 从文件到内存的一条数据管道.
但是这时只是搭建好了1个管道, 并没有数据传输
- ch = fr.read(); //throws IOEXCEPTION
当执行1次 fr.read() 时, 就从文件读取一个字符, 并把这个字符保存入内存(Stack内存 ch变量)中.
这个方法需要处理IOException
- while(ch > -1){ //if ch = -1, means got the end of the file
- System.out.printf("%c",(char)ch);
- ch = fr.read(); //throws IOEXCEPTION
- }
这个也不难理解, 每读到1个字符, 就把这个字符输出到屏幕上, 直到读完整个文件.
如下图:
而第一句建立的对象 FileReader fr实际上就是1个文件读字符流
流(Stream)实际上就是从数据文件到程序的一条管道.
至于数据怎么从程序输出到屏幕, 这个并不是流的范畴.
1.5 Java Stream流的定义
看完上面例子的话, 流的定义就很容易看懂了.
Stream是java的1个类, 这个类专门用于程序和外部设备的输入输出(IO). 基本上所有流都在 java.io这个包中.
实际上Stream就是数据在程序和外部设备的单向管道, 流的各种方法相当于管道上的各种按钮.
所谓的外部设备可以包括硬盘文件, 网络设备, 另个程序等. 也就是当前程序之外的数据设备.
二, 为什么需要Stream(流).
看懂了上面的的例子, Stream存在的意义也很简单.
1. 数据的传输量很大.
2. 内存有限.
3. 带宽有限.
而Stream可以1点1点地逐步传输所有数据, 这就是Stream存在的根本意义.
想想我们是怎样下载1个大文件的, 下载软件(例如x雷)并不会占用你内存很大的空间, 而只是在内存划分1个缓冲区, 一点一点地下载到自己的内存(缓冲区满了再写到硬盘), 这也是流的1个例子啊.
三,流的重要特性.
3.1 流是java里的一个类
也就是将流就是类的一种, 但反过来类不是流
3.2 数据并不会在流里自动传输
而是需要执行流的方法, 一次传输一定量的数据.
3.3 1个流对象只有1个传输方向
也就是说流是单向的, 数据要么从程序到设备(OutputStream), 要么从设备到程序(InputStream).
http://blog.csdn.net/nvd11/article/details/29917065
Java Stream简介, 流的基本概念的更多相关文章
- 了解PHP中Stream(流)的概念与用法(转)
Stream是PHP开发里最容易被忽视的函数系列(SPL系列,Stream系列,pack函数,封装协议)之一,但其是个很有用也很重要的函数.Stream可以翻译为“流”,在Java里,流是一个很重要的 ...
- 了解PHP中Stream(流)的概念与用法
Stream是PHP开发里最容易被忽视的函数系列(SPL系列,Stream系列,pack函数,封装协议)之一,但其是个很有用也很重要的函数.Stream可以翻译为“流”,在Java里,流是一个很重要的 ...
- Java Stream函数式编程第三篇:管道流结果处理
一.Java Stream管道数据处理操作 在本号之前写过的文章中,曾经给大家介绍过 Java Stream管道流是用于简化集合类元素处理的java API.在使用的过程中分为三个阶段.在开始本文之前 ...
- [源码解析] 当 Java Stream 遇见 Flink
[源码解析] 当 Java Stream 遇见 Flink 目录 [源码解析] 当 Java Stream 遇见 Flink 0x00 摘要 0x01 领域 1.1 Flink 1.2 Java St ...
- Java修炼——IO流的概念以及其分类
IO流的基本概念: 流的原理: 1) 在 Java 程序中,对于数据的输入/输出操作以"流" (stream) 方式进行: 2) J2SDK 提供了各种各样的"流&quo ...
- 深度掌握 Java Stream 流操作,让你的代码高出一个逼格!
概念 Stream将要处理的元素集合看作一种流,在流的过程中,借助Stream API对流中的元素进行操作,比如:筛选.排序.聚合等. Stream 的操作符大体上分为两种:中间操作符和终止操作符 中 ...
- 【转】输入/输出流 - 深入理解Java中的流 (Stream)
基于流的数据读写,太抽象了,什么叫基于流,什么是流?Hadoop是Java语言写的,所以想理解好Hadoop的Streaming Data Access,还得从Java流机制入手.流机制也是JAVA及 ...
- Java IO 理解流的概念
Java IO 理解流的概念 @author ixenos 在理解流时首先理解以下概念 1.流的来源和去向一般在构造器指出 2.方法中的形参一般是将流输出到某个位置,读取(INPUT)流从流读出数据( ...
- java 并发多线程显式锁概念简介 什么是显式锁 多线程下篇(一)
目前对于同步,仅仅介绍了一个关键字synchronized,可以用于保证线程同步的原子性.可见性.有序性 对于synchronized关键字,对于静态方法默认是以该类的class对象作为锁,对于实例方 ...
随机推荐
- C#中调用Dll动态链接库
C#中调用Dll动态链接库 起始 受限于语言的不同,我们有的时候可能会用别人提供的函数及方法 或者其他的什么原因.反正就是要调!!! 恰巧别人所使用的的语言跟自己又不是一样的 这个时候想要调用别人的函 ...
- maven创建spring项目之后,启动报错java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
出错情景:maven中已经加载了spring的核心包,但是项目启动时,报错: org.apache.catalina.core.StandardContext listenerStart严重: Err ...
- 嵌入式 视频编码(H264)hi3518
这几天在编写视频录制模块,所以,闲暇之余,又粗粗的整理了一下,主要是API,以备不时之用 摄像头获取的模拟信号通过经芯片处理(我们使用的是CX25825),将模拟信号转成数字信号,产生标准的IT ...
- hdu 1846 Brave Gam
Brave Game http://acm.hdu.edu.cn/showproblem.php?pid=1846 Time Limit: 1000/1000 MS (Java/Others) ...
- HDU 4778 状压DP
一看就是状压,由于是类似博弈的游戏.游戏里的两人都是绝对聪明,那么先手的选择是能够确定最终局面的. 实际上是枚举最终局面情况,0代表是被Bob拿走的,1为Alice拿走的,当时Alice拿走且满足变换 ...
- elasticsearch创建索引
1.通过elasticsearch-head 创建 (1)登录localhost:9100 (2)点击复合查询 (3)输入内容 (4)勾选易读,点击验证是否是JSON格式 (5)点击提交请求,返回 { ...
- 【BZOJ】2337: [HNOI2011]XOR和路径 期望+高斯消元
[题意]给定n个点m条边的带边权无向连通图(有重边和自环),在每个点随机向周围走一步,求1到n的期望路径异或值.n<=100,wi<=10^9. [算法]期望+高斯消元 [题解]首先异或不 ...
- 【BZOJ】3527: [Zjoi2014]力 FFT
[参考]「ZJOI2014」力 - FFT by menci [算法]FFT处理卷积 [题解]将式子代入后,化为Ej=Aj-Bj. Aj=Σqi*[1/(i-j)^2],i=1~j-1. 令f(i)= ...
- 【Linux 命令】fping ping 包间隔时间详解
服务器间检查会用到fping的命令,期间遇到了一个问题,需要将ping包间的间隔时间设置为100毫秒,查看fping -h看下,找到了-i和-p两个参数: 看到这两个参数,我当时的表情是这样的: 看不 ...
- HDU 5995 Kblack loves flag (模拟)
题目链接 Problem Description Kblack loves flags, so he has infinite flags in his pocket. One day, Kblack ...