关于流的理解

在计算机里就是顺序读取或者写入的字节序列。这是很多现实存在的输入和输出的模型抽象,比如说磁带,只能按顺序读,否则只能倒带到开头重新开始;比如穿孔卡片或者纸带,只能从一头往里放,很难两头移动。磁盘、光盘等存储介质是可以随机读写的,但是为了兼容这些比较老的存储介质,也经常会使用流的模型来统一处理,通常顺序读写的效率也会比随机读写要高。一般这种数据的特点首先是只能顺序读写(或者随机读写效率很低),其次是量很大没法一次读进内存处理,所以需要一边读写一边进行处理。

流是能统一描述所有常见输入输出类型的模型,包括文件、键盘、显示器、磁带等等,因此使用非常广泛,统一使用流的模型描述之后,相同的程序就可以通过输入输出重定向来处理不同的对象,这其实是多态的思想。后来网络出现之后,网络本来是基于分组交换的,但为了能让网络IO也适用流的模型,设计了TCP协议,从此网络协议也大部分都会使用流的模型来描述

假设我们有个大水缸,水缸里灌满了水,为了能够让水从大水缸里拿出来使用,就需要接一个水龙头,打开水龙头,水就出来了。

可是大水缸除了放水,我们还希望能不断的蓄水,于是就需要有另外一个口可以给水缸蓄水,蓄水口默认是关闭的,每次都要打开蓄水口。

假设我们往大水缸里蓄水,水有N杯,我们只能一杯一杯的往里灌,每次灌入就要打开蓄水口,

为了提高蓄水速度,我们想到了一个办法,准备一个盆,每个盆只能装512杯水,当盆装满后,再从盆里往水缸里灌入。

水就相当于计算机里的数据,而数据是有顺序而且以字节方式存在的,出水口和入水口对应输入输出流,stdin和stdout,而后面加的盆就是内部缓冲区,大水缸就是我们的磁盘,磁盘操作相对于cpu的处理速度来说非常慢,所以为了提高效率,引入了内部缓冲区。

昨天刚好想到了这个概念,搜到了这个话题,然后我也结合我自己的理解,回答一波。

其实楼上的已经回答的很好了,也给了我启发,我这里再结合代码稍作修饰。

try {
    FileInputStream fileInputStream = new FileInputStream(f);//这是左边的水缸
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();//这是右边的水缸
    byte[] buffer = new byte[1000];  //准备一个瓢
    int readCount = 0;
    while ((readCount = fileInputStream.read(buffer)) != -1) {   //一直舀
        byteArrayOutputStream.write(buffer, 0, readCount);
    }
    fileInputStream.close();  //关掉出水水龙头
    byteArrayOutputStream.close();   //关掉进水口
    return byteArrayOutputStream.toByteArray();
} catch (IOException e) {
    e.printStackTrace();
}

这是一段很典型的Java从文件中读取字节流的代码,注释已经很形象地解释了整个过程。

现在假设有两个水缸在你前面,一个位于左边,一个位于右边。左边的水缸在计算机里可以是一个文件,也可以是键盘的输入等输入设备。右边的水缸可以是一个文件,也可以是一块内存或者屏幕等输出设备

现在你要把一个文件从一个地方挪到另一个地方,比如从C盘挪到D盘,或者是单纯地从磁盘上读取到内存里。你要把左边水缸里的水挪到右边的水缸里去,这时候你怎么办呢?你手上没有任何工具,除了一个瓢!

然后你拿着一个只能放1000个字节大小的瓢,要把水缸的水挪出去,你懒得动手去舀,你惊奇地发现左边的水缸上有一个水龙头,右边的水缸有一个进水通道,你拧开水龙头,水就自动流出来了,而且更神奇的是你把瓢放到水龙头底下,水就流出来,你一拿开,水就停住了,于是你等瓢满了就从右边水缸的进水口灌进去,于是你一直这样操作,循环反复,直到把水放完,最后的一次可能只有半瓢水,这时候你明白,再把瓢放到水龙头底下也不可能再有水流出来了,于是你拧紧了水龙头,关掉了它。再把右边的进水口也挡住了。

你成功地把左边水缸的水挪到了右边。

“流是与外围设备关联的数据的源和目的地。”

把数据源和数据目的地以及从源到目的地的过程,这三个部分作为一个整体看待就是“流”,通俗的描述就是:数据 从源“流动”到目的地。

打开一个“流”意味着在源和目的地之间建立起一条通路(数据传输方式),数据便沿着这条这条路传输

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值