本文旨在引申出来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 ,也就是输入和输出.
所有的应用程序都是工作在用户态,可是所有的系统资源都是操作系统管理,也就是内核态
所以说,应用程序的输入输出,必须要依赖操作系统.
操作系统本身就是一种高层次的抽象,他负责管理文件,文件本身也是一种抽象.
如上图所示
作为应用程序员,我们都是工作在应用程序层
我们会使用某种程序设计语言,编写我们自己的应用程序
程序设计语言给我们提供了IO类库以便更高效的进行程序编写
IO类库通过调用操作系统提供的文件系统调用接口来完成最终的功能

IO不仅仅是跟操作系统打交道

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

[零] JavaIO入门简介 程序设计语言 为什么需要IO库的更多相关文章

  1. 002 01 Android 零基础入门 01 Java基础语法 01 Java初识 02 Java简介

    002 01 Android 零基础入门 01 Java基础语法 01 Java初识 02 Java简介 学习Java的基础语法 Java是一门编程语言,学习的逻辑其实和现实世界的语言是一样的,需要了 ...

  2. 005 01 Android 零基础入门 01 Java基础语法 01 Java初识 05 Eclipse简介

    005 01 Android 零基础入门 01 Java基础语法 01 Java初识 05 Eclipse简介 Eclipse是一款集成开发工具--IDE. 集成开发环境(IDE,Integrated ...

  3. 零基础入门该如何实现C 语言面向对象编程(很有帮助)

    零基础如果更快更好的入门C语言,如何在枯燥的学习中找到属于自己的兴趣,如果把学习当成一种事务性的那以后的学习将会很难有更深入的进步,如果带着乐趣来完成学习那将越学越有意思这样才会让你有想要更深入学习的 ...

  4. 大神教零基础入门如何快速高效的学习c语言开发

    零基础如果更快更好的入门C语言,如何在枯燥的学习中找到属于自己的兴趣,如果把学习当成一种事务性的那以后的学习将会很难有更深入的进步,如果带着乐趣来完成学习那将越学越有意思这样才会让你有想要更深入学习的 ...

  5. [Java入门笔记] Java语言简介

    前言 学习Java有一段时间了,但是一直缺少一个系统的思想,现在重新通过书籍中.网上的文章,视频等资料,整理与回顾Java的知识点. 言归正传,让我们先从了解Java语言开始. Java语言的由来 J ...

  6. Oberon程序设计语言简介

    Oberon奥伯龙是一种通用编程语言,也是一种同名操作系统(由Oberon语言开发,且参考过贝尔实验室的新一代网络操作系统Plan9),是由原Pascal程序设计语言的发明者Niklaus Wirth ...

  7. Linux及Arm-Linux程序开发笔记(零基础入门篇)

    Linux及Arm-Linux程序开发笔记(零基础入门篇)  作者:一点一滴的Beer http://beer.cnblogs.com/ 本文地址:http://www.cnblogs.com/bee ...

  8. 【Linux开发】Linux及Arm-Linux程序开发笔记(零基础入门篇)

    Linux及Arm-Linux程序开发笔记(零基础入门篇) 作者:一点一滴的Beer http://beer.cnblogs.com/ 本文地址:http://www.cnblogs.com/beer ...

  9. MongoDB入门简介

    MongoDB入门简介 http://blog.csdn.net/lolinzhang/article/details/4353699 有关于MongoDB的资料现在较少,且大多为英文网站,以上内容大 ...

随机推荐

  1. dubbo+zookeeper报错:com.alibaba.dubbo.rpc.RpcException: Failed to invoke the method

    com.alibaba.dubbo.rpc.RpcException: Failed to invoke the method可能的错误原因有三个前两个是从网上摘得, 第三个是自己解决的 1.需要进行 ...

  2. 资源验证(Modified)

    Last-Modified : 上次修改时间 配合 If-Modified-Since 或者 If-Unmodified-Since  (请求头携带) 对比上次修改时间对资源进行验证 Etag验证 数 ...

  3. springboot增删改查

    改https://blog.csdn.net/weixin_42338186/article/details/81561592 添加https://blog.csdn.net/weixin_42338 ...

  4. eclipse中生成的html存在中文乱码问题的解决方法

    最近在做测试报告生成时遇到了个中文乱码的问题,虽然在html创建过程中设置了编码格式htmlReporter.config().setEncoding("UTF-8");但是生成的 ...

  5. Vue取消eslint语法限制

    话不多说,先上图: 当然,这里的警告我是知道怎么回事,原来eslint是一个语法检查工具,但是限制很严格,在我的vue文件里面很多空格都会导致红线警告(可以屏蔽),虽然可以屏蔽,但是在编译的时候老是会 ...

  6. 牛人的blog,关于推荐,topic model的

    http://blog.csdn.net/zhoubl668?viewmode=list

  7. Hadoop 操作常见问题解决

    1. 安全模式下不可操作 提示信息: Hadoop "Cannot create directory .Name node is in safe mode." 解决方法: $ ha ...

  8. 在React Native中,使用fetch网络请求 实现get 和 post

    //在React Native中,使用fetch实现网络请求 /* fetch 是一个封装程度更高的网络API, 使用了Promise * Promise 是异步编程的一种解决方案 * Promise ...

  9. JS日历插件 - My97 DatePicker用法详解

    一.简介 1. 注意事项 (1)My97DatePicker目录是一个整体,不可破坏里面的目录结构,也不可对里面的文件改名,可以改目录名: (2)各目录及文件的用途: WdatePicker.js 配 ...

  10. Hadoop 排序

    数据排序是许多实际任务在执行时要完成的第一项工作,比如学生成绩评比.数据建立索引等.这个实例和数据去重类似,都是先对原始数据进行初步处理,为进一步的数据操作打好基础. 1.实例描述 对输入文件中的数据 ...