[零] JavaIO入门简介 程序设计语言 为何须要IO库

  本文旨在引伸出来Java IO的概念含义,做为学习JavaIO一个起步的了解知识点
部份内容引自<计算机操做系统第三版> 

操做系统的文件管理

 
"在现代计算机系统中,要用到大量的程序和数据,因内存容量有限,且不能长期保存,
故而平时老是把它们以文件的形式存放在外存中,须要时再随时将它们调入内存。
若是由用户直接管理外存上的文件,不只要求用户熟悉外存特性,了解各类文件的属性,
以及它们在外存上的位置,并且在多用户环境下,还必须能保持数据的安全性和一致性。
显然,这是用户所不能胜任、也不肯意承担的工做。
因而,取而代之的即是在操做系统中又增长了文件管理功能,即构成一个文件系统,
负责管理在外存上的文件,并把对文件的存取、共享和保护等手段提供给用户。
这不只方便了用户,保证了文件的安全性,还可有效地提升系统资源的利用率。"
 
归纳的说就是,现代操做系统的文件管理工做,由操做系统提供,应用程序不会直接管理

组织形式和处理方式分类

 
文件有多种分类方式,此处只是按照 组织形式和系统对其的处理方式 对其分类
根据文件的组织形式和系统对其的处理方式,可将文件分为三类:
(1)  普通文件:由ASCII码或二进制码组成的字符文件。
通常用户创建的源程序文件、数据文件、目标代码文件及操做系统自身代码文件、库文件、实用程序文件等
都是普通文件,它们一般存储在外存储设备上。
(2)  目录文件:由文件目录组成的,用来管理和实现文件系统功能的系统文件,
经过目录文件能够对其它文件的信息进行检索。因为目录文件也是由字符序列构成,所以对其可进行与普通文件同样的种种文件操做。
(3)  特殊文件:特指系统中的各种 I/O 设备。
为了便于统一管理,系统将全部的 输入/输出设备都视为文件,
按文件方式提供给用户使用,如目录的检索、权限的验证等都与普通文件类似,只是对这些文件的操做是和设备驱动程序紧密相连的,系统将这些操做转为对具体设备的操做。
根据设备数据交换单位的不一样,又可将特殊文件分为块设备文件和字符设备文件。
前者用于磁盘、光盘或磁带等块设备的 I/O  操做,然后者用于终端、打印机等字符设备的I/O 操做。 

文件的操做

用户经过文件系统所提供的系统调用实施对文件的操做。
最基本的文件操做有: 建立文件、删除文件、读文件、写文件、截断文件和设置文件的读/写位置。
但对于一个实际的OS,为了方便用户使用文件而提供了更多的对文件的操做,如打开和关闭一个文件及改变文件名等操做。 

基本操做

(1)  建立文件。
在建立一个新文件时,系统首先要为新文件分配必要的外存空间,并在文件系统的目录中,为之创建一个目录项。
目录项中应记录新文件的文件名及其在外存的地址等属性。
(2)  删除文件。
当已再也不须要某文件时,可将它从文件系统中删除。在删除时,系统应先从目录中找到要删除文件的目录项,使之成为空项,而后回收该文件所占用的存储空间。 
(3)  读文件。
在读一个文件时,须在相应系统调用中给出文件名和应读入的内存目标地址。此时,系统一样要查找目录,找到指定的目录项,从中获得被读文件在外存中的位置。在目录项中,还有一个指针用于对文件的读/写。
(4)  写文件。
在写一个文件时,须在相应系统调用中给出该文件名及该文件在内存中的(源)地址。
为此,也一样须先查找目录,找到指定文件的目录项,再利用目录中的写指针进行写操做。
(5)  截断文件。
若是一个文件的内容已经陈旧而须要所有更新时,一种方法是将此文件删除,再从新建立一个新文件。
但若是文件名及其属性均无改变时,则可采起另外一种所谓的截断文件的方法,此即将原有文件的长度设置为0,或者说是放弃原有的文件内容。
(6)  设置文件的读/写位置。
前述的文件读/写操做都只提供了对文件顺序存取的手段,即每次都是从文件的始端读或写。
设置文件读/写位置的操做,用于设置文件读/写指针的位置,以便每次读/写文件时,不是从其始端而是从所设置的位置开始操做。也正因如此,才能改顺序存取为随机存取。

文件的打开和关闭

当前OS所提供的大多数对文件的操做, 其过程大体都是这样两步:
第一步是经过检索文件目录来找到指定文件的属性及其在外存上的位置;
第二步是对文件实施相应的操做,如读文件或写文件等。
当用户要求对一个文件实施屡次读/写或其它操做时,每次都要从检索目录开始。
为了不屡次重复地检索目录,在大多数OS中都引入了“打开”(open)这一文件系统调用
当用户第一次请求对某文件进行操做时,先利用 open系统调用将该文件打开。
 
所谓“打开” ,是指系统将指名文件的属性(包括该文件在外存上的物理位置)从外存拷贝到内存打开文件表的一个表目中,并将该表目的编号(或称为索引)返回给用户。
之后,当用户再要求对该文件进行相应的操做时,即可利用系统所返回的索引号向系统提出操做请求。
 
系统这时即可直接利用该索引号到打开文件表中去查找,从而避免了对该文件的再次检索。
这样不只节省了大量的检索开销,也显著地提升了对文件的操做速度。
若是用户已再也不须要对该文件实施相应的操做时,可利用“关闭”(close)系统调用来关闭此文件,OS将会把该文件从打开文件表中的表目上删除掉。 

程序设计中的IO

因此,咱们如今能够肯定,对于系统中的程序和数据的管理,都是操做系统帮助咱们进行管理的
应用程序中对文件的操做,也都是请求操做系统
 
I/O 含义为 in  和 out,也就是 入  和 出,计算机世界里,通常指代的是input 和output ,也就是输入和输出.
全部的应用程序都是工做在用户态,但是全部的系统资源都是操做系统管理,也就是内核态
因此说,应用程序的输入输出,必需要依赖操做系统.
操做系统自己就是一种高层次的抽象,他负责管理文件,文件自己也是一种抽象.
image_5b92107a_226c
如上图所示
做为应用程序员,咱们都是工做在应用程序层
咱们会使用某种程序设计语言,编写咱们本身的应用程序
程序设计语言给咱们提供了IO类库以便更高效的进行程序编写
IO类库经过调用操做系统提供的文件系统调用接口来完成最终的功能

IO不只仅是跟操做系统打交道

做为开发者,咱们可能不只仅会经过操做系统 读取或者写入 数据.文件.
咱们还极其可能会对咱们读取的文件数据进行操做,并且,事实上咱们几乎不会单纯的从操做系统读写数据
咱们也可能从其余来源得到数据,组装数据,这些都是程序设计中的IO要作的事情
也就是说程序语言中的IO
不只仅要解决温饱问题(经过操做系统读取文件)
还要解决奔小康的问题(可以对各类来源,各类数据文件 更便捷的进行操做)
 
程序设计语言的IO类库,是做为程序设计语言的支撑存在的
没有行不行?没有固然能够,没有程序设计语言的时候,大神们还用二进制纸带去编程呢
可是效率?难度? 等等??  可想而知
若是一门高级程序设计语言,基本的方法函数都须要所有本身去实现的话
这门语言不太可能有人去用,除非他有什么天才之处或者特殊场景 就另当别论了
因此说,程序设计语言必须设计一套合适的IO方法类库以供调用
 
image_5b92107a_393f
 
因此想要设计好一个程序语言的IO类库,有两个基本方面:
逻辑功能使用上须要尽最大可能的照顾到开发者
实现上尽量的高效
固然上面说的这些须要解决的问题
并不只限于Java IO 其余语言中类库涉及这面临的也是这些问题
不过这两个方面,就足够让人头疼了,咱们会在接下来系统的介绍Java IO,领略一下Java IO的风采~
 
个人博客即将搬运同步至腾讯云+社区,邀请你们一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=hs07dhocm7xg
相关文章
相关标签/搜索