Java中的“流”其实是一个抽象的概念,很难去具象描述。其实这个概念并不单纯存在于Java之中,而是广泛存在计算机科学领域中。从编程的角度来讲,几乎所有的高级编程语言都存在“流”这个概念。
我们可以借助一些现实生活中比较熟悉的事物来理解“流”这个概念。
首先这一说法是翻译字英语单词“stream”的,这个单词在做名词解释的时候,通常都是指水流、河流、溪流等。在做动词解释的时候,就有“流动”的意思。
转换到Java或其它编程语言当中,它其实指的是“数据流”、“数据的流动”这一概念。最常见的使用场景就是对计算机中的文件的读写操作了。那么问题又来了,“数据流”到底指的又是什么呢?
举一个最简单的例子,比如隔壁老王刚从网上下载了一部非常具有教育意义的电影,为了不被发现,老王将这部电影从电脑硬盘中剪切,然后复制到自己珍藏的移动硬盘中。
在这个过程中,电影文件的移动其实就构成了“数据流”——想象成一个小水塘里的水,从原来的小坑流向了另外一个小坑。
进一步简单拆解一下,“数据流”还可以简单分为“输入流”和“输出流”。
什么是“输入流”?回到刚才的例子,为了移动电影文件,计算机首先需要知道要移动的是哪个文件。大家知道,计算机中的所有文件其最终形式都是一大串仅仅由“0”和“1”组成的编码,所以计算机必须读取这个文件的所有“0”和“1”编码,才能获得一整个完整的文件。这种读取文件的操作,如果编程去实现的话,就需要用到“输入流”——从文件原本所在的位置,将文件的内容输入到计算机内存中,以便CPU进行处理(这里牵涉到比较基础的计算机原理,有兴趣的同学可以自行研究,或者关注我)。
而当老王打开自己的移动硬盘,用鼠标选择“粘帖”的时候,就会用到“输出流”——CPU会将刚才经由输入流所读取到的电影内容,从内存中写到移动硬盘,即“输出”到移动硬盘中。
无论是输出还是输入,计算机在操作文件或数据的时候,都不是瞬间就能将一个文件一下子处理好的,都是在硬件层面逐个去处理“0”或者“1”的。文件越大,“0”和“1”就越多,这就像是一条由无数个“0”和“1”前后相接所组成的长长的“河流”——这也就是“流”这一概念的来源。
没有提到任何具体编程语言的东西,不知道这个解答能不能帮助到题主。
可以参考原文
***/item/6508122008138547720/?iid=23372928016&app=news_article×tamp=1516349689&tt_from=copy_link&utm_source=copy_link&utm_medium=toutiao_ios&utm_campaign=client_share
Java中I/O流概述
对于输入流和输出流的基本概念通过下面的图进行说明:
-
上图是一台机器通过网络读取服务端数据,此图要说明的是流的一些基本概念。在服务器端,数据存储在磁盘上,将磁盘上的数据读取到服务器内存的过程是输入流,服务器通过网络将内存中的数据输出到客户端对于服务器内存来说是输出流。
-
在单机客户端,通过网络读取数据到内存的过程对于客户端内存是输入流,把读取到内存中的数据写入到磁盘的的过程对于客户端内存是输出流。所以输入流输出流是针对内存来说的。对于输入流就是读取的过程(Read),而输出流就是写的过程(Write)。
-
根据读写数据方式的不同,流可以分为字节流和字符流。
-
字节流按照字节的方式读取和写出数据,读写的最小单位是字节,字节流可以读写任何数据。
-
字符流读写数据的最小单位是一个字符,在Java中一个字符占用两个字节。
-
字符流只适合读写纯文本数据,如果读取的是图片、视频和二进制文件,需要使用字节流读写。在Java中,所有的字节流都是以Stream结尾,而字符流都是以Reader和Writer结尾。
-
文件中的信息是由一连串的字节或字符构成的,组成文件的字节序列称为字节流,组成文件的字符序列称为字符流。在Java中根据流的方向可以分为输入流和输出流。输入流是将磁盘上的文件或其它输入设备的数据加载到内存的过程。输出流与输入流相反,是将内存中的数据保存到磁盘文件或其他输出设备。
输入和输出流图解
文件是由字符或字节构成的,如纯文本文件是字符流,二进制文件如图片、视频是字节流。那么将磁盘上的文件加载到内存或再将内存中的数据输出到文件,需要有输入和输出流的支持,那么在Java语言中又把输入流和输出流各分为了两种,字节输入流和字节输出流,字符输入流和字符输出流。
本文来自投稿,不代表天一生活立场,如若转载,请注明出处:http://tiyigo.com/it/41454.html