— 1 —
操作系统的文件管理
在现代计算机系统中,要用到大量的程序和数据,因内存容量有限,且不能长期保存,故而平时总是把它们以文件的形式存放在外存中,需要时再随时将它们调入内存。如果由用户直接管理外存上的文件,不仅要求用户熟悉外存特性,了解各种文件的属性,以及它们在外存上的位置,而且在多用户环境下,还必须能保持数据的安全性和一致性。
显然,这是用户所不能胜任、也不愿意承担的工作。
于是取而代之的便是在操作系统中又增加了文件管理功能,即构成一个文件系统,负责管理在外存上的文件,并把对文件的存取、共享和保护等手段提供给用户。这不仅方便了用户,保证了文件的安全性,还可有效地提高系统资源的利用率。 概括的说就是:现代操作系统的文件管理工作,由操作系统提供,应用程序不会直接管理。— 2 —
组织形式和处理方式分类
文件有多种分类方式,此处只是按照组织形式和系统对其的处理方式对其分类,根据文件的组织形式和系统对其的处理方式,可将文件分为三类:(1)普通文件:由ASCII码或二进制码组成的字符文件。一般用户建立的源程序文件、数据文件、目标代码文件及操作系统自身代码文件、库文件、实用程序文件等,都是普通文件,它们通常存储在外存储设备上。
(2)目录文件:由文件目录组成的,用来管理和实现文件系统功能的系统文件。通过目录文件可以对其它文件的信息进行检索。由于目录文件也是由字符序列构成,因此对其可进行与普通文件一样的种种文件操作。
(3)特殊文件:特指系统中的各类 I/O 设备。为了便于统一管理,系统将所有的 输入/输出设备都视为文件,按文件方式提供给用户使用。如目录的检索、权限的验证等都与普通文件相似,只是对这些文件的操作是和设备驱动程序紧密相连的,系统将这些操作转为对具体设备的操作。
根据设备数据交换单位的不同,又可将特殊文件分为块设备文件和字符设备文件。前者用于磁盘、光盘或磁带等块设备的 I/O 操作,而后者用于终端、打印机等字符设备的I/O 操作。
— 3 —
文件的操作
用户通过文件系统所提供的系统调用实施对文件的操作。最基本的文件操作有: 创建文件、删除文件、读文件、写文件、截断文件和设置文件的读/写位置。但对于一个实际的OS,为了方便用户使用文件而提供了更多的对文件的操作,如打开和关闭一个文件及改变文件名等操作。
基本操作
(1) 创建文件。在创建一个新文件时,系统首先要为新文件分配必要的外存空间,并在文件系统的目录中,为之建立一个目录项。目录项中应记录新文件的文件名及其在外存的地址等属性。(2) 删除文件。当已不再需要某文件时,可将它从文件系统中删除。在删除时,系统应先从目录中找到要删除文件的目录项,使之成为空项,然后回收该文件所占用的存储空间。 (3) 读文件。在读一个文件时,须在相应系统调用中给出文件名和应读入的内存目标地址。此时,系统同样要查找目录,找到指定的目录项,从中得到被读文件在外存中的位置。在目录项中,还有一个指针用于对文件的读/写。
(4) 写文件。在写一个文件时,须在相应系统调用中给出该文件名及该文件在内存中的(源)地址。为此,也同样须先查找目录,找到指定文件的目录项,再利用目录中的写指针进行写操作。
(5) 截断文件。如果一个文件的内容已经陈旧而需要全部更新时,一种方法是将此文件删除,再重新创建一个新文件。但如果文件名及其属性均无改变时,则可采取另一种所谓的截断文件的方法,此即将原有文件的长度设置为0,或者说是放弃原有的文件内容。
(6) 设置文件的读/写位置。前述的文件读/写操作都只提供了对文件顺序存取的手段,即每次都是从文件的始端读或写。设置文件读/写位置的操作,用于设置文件读/写指针的位置,以便每次读/写文件时,不是从其始端而是从所设置的位置开始操作。也正因如此,才能改顺序存取为随机存取。
文件的打开和关闭
当前OS所提供的大多数对文件的操作, 其过程大致都是这样两步:第一步是通过检索文件目录来找到指定文件的属性及其在外存上的位置;第二步是对文件实施相应的操作,如读文件或写文件等。当用户要求对一个文件实施多次读/写或其它操作时,每次都要从检索目录开始。为了避免多次重复地检索目录,在大多数OS中都引入了“打开”(open)这一文件系统调用当用户第一次请求对某文件进行操作时,先利用 open系统调用将该文件打开。 所谓“打开” ,是指系统将指名文件的属性(包括该文件在外存上的物理位置)从外存拷贝到内存打开文件表的一个表目中,并将该表目的编号(或称为索引)返回给用户。以后,当用户再要求对该文件进行相应的操作时,便可利用系统所返回的索引号向系统提出操作请求。 系统这时便可直接利用该索引号到打开文件表中去查找,从而避免了对该文件的再次检索。这样不仅节省了大量的检索开销,也显著地提高了对文件的操作速度。如果用户已不再需要对该文件实施相应的操作时,可利用“关闭”(close)系统调用来关闭此文件,OS将会把该文件从打开文件表中的表目上删除掉。
— 4 —
程序设计中的IO
所以,我们现在可以确定,对于系统中的程序和数据的管理,都是操作系统帮助我们进行管理的应用程序中对文件的操作,也都是请求操作系统 I/O 含义为 in 和 out,也就是 入 和 出,计算机世界里,一般指代的是input 和output ,也就是输入和输出.所有的应用程序都是工作在用户态,可是所有的系统资源都是操作系统管理,也就是内核态所以说,应用程序的输入输出,必须要依赖操作系统.操作系统本身就是一种高层次的抽象,他负责管理文件,文件本身也是一种抽象.如上图所示,作为应用程序员,我们都是工作在应用程序层。我们会使用某种程序设计语言,编写我们自己的应用程序。程序设计语言给我们提供了IO类库,以便更高效的进行程序编写,IO类库通过调用操作系统提供的文件系统调用接口来完成最终的功能。
IO不仅仅是跟操作系统打交道
作为开发者,我们可能不仅仅会通过操作系统读取或者写入数据文件。我们还极其可能会对我们读取的文件数据进行操作,而且,事实上我们几乎不会单纯的从操作系统读写数据。我们也可能从其他来源获得数据、组装数据,这些都是程序设计中的IO要做的事情。
也就是说程序语言中的IO:
不仅仅要解决温饱问题(通过操作系统读取文件)
还要解决奔小康的问题(能够对各种来源,各种数据文件 更便捷的进行操作)
程序设计语言的IO类库,是作为程序设计语言的支撑存在的。没有行不行?没有当然可以,没有程序设计语言的时候,大神们还用二进制纸带去编程呢!但是效率?难度?等等困难,可想而知。而且,如果一门高级程序设计语言,基本的方法函数,都需要全部自己去实现的话,这门语言不太可能有人去用,除非他有什么天才之处或者特殊场景,就另当别论了。所以说,面向大众使用的程序设计语言,必须设计一套合适的IO方法类库以供调用。 所以想要设计好一个程序语言的IO类库,有两个基本方面:
逻辑功能使用上需要尽最大可能的照顾到开发者;
实现上尽可能的高效;
当然上面说的这些需要解决的问题,并不仅限于Java IO,其他语言中类库涉及这面临的也是这些问题。不过这两个方面,就足够让人头疼了,我们会在接下来系统的介绍Java IO,领略一下Java IO的风采~
https://mp.weixin.qq.com/s/z4VFiWXa9Hh9yqkr8dX5Eg