刨根问底!!到底什么是文件?什么是流

刨根问底!!到底什么是文件?什么是流_第1张图片
一个困惑编程初学者的问题:“到底什么是流(Stream)?” 很多人会这样解释:流就像水管一样,文件等就像是水池,你可以通过流从水池里取水或者存水。看似形象的解释一点不好玩,只会让初学者更加一头雾水。特别是刚接触Java 的看到各种InputStream、OutputStream 肯定是崩溃的,每种Stream都是干什么的,到底什么时候用哪种?。最开始我也一样,听完水管的的比喻感觉自己懂了,可是当有人问我什么是流的时候,发现用水管解释总有不妥。

流是一个抽象概念,这种比喻性的解释并没有道出其本质,所以说了还不如不说。其实流是对IO设备操作的封装。如果在Java里它们只不过是一组接口,对内存、磁盘、网络等IO设备操作封装的接口(Interface),方便我们编程的时候使用。根据对象的不同会有文件流、网络流等。根据操作的不同会有输入流和输出流。

往更深一层思考,磁盘、网络等IO设备到底是什么。比如从磁盘读取文件,文件是怎么被存储到磁盘上的,我们在纸上写的中文是怎么在屏幕上显示出来的,难道计算机也懂中文?不是说计算机只认识0和1吗?是的,计算机是只懂0和1 。那为什么计算机只懂0和1,还有计算机懂0和1是什么意思,计算机不是人,怎么会有懂或不懂一说。

简单解释一下,计算机是很复杂的,但是其本质是一堆逻辑电路,通过电路的通和不通或者电平高低来表示两种不同的状态,而正好这两种状态人们用0和1来代替。不要小看只有两种状态,你可以用这两种状态来实现所有的逻辑运算或与非,进一步可以实现一些加法器,乘法器,然后就有了各种数学计算,这其中会有一门重要的数学叫布尔代数。记得刚上离散数学的时候老师说离散数学很重要,这是计算机的基础。其实离散熟悉里面很重要的组成就是布尔代数。那中文是怎么记录的?首先要知道不管中文还是英文,本质上是一种字符,人们通过不同的编码把字符映射成了数字,而这个过程就是我们平时见到的ASCII,UNICODE编码的原理

为了屏蔽计算机最底层的操作,抽象就变得尤其重要。很多概念被一层层抽象,封装。硬件层之上会有很多驱动程序,然后操作系统会进一步的抽象,编程语言会和复杂的操作系统交流,最后我们对文件的操作就是通过File或者Stream这种接口。

上面的介绍说得不够详细甚至有不准确的地方。但是这种思考方式绝对是一种必备素质,不满足表象,找到问题的本质,是理解和解决一个问题的关键,至少在计算机领域如此。

你可能感兴趣的:(技术)