本文旨在引申出来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. Android SQLite数据库升级,怎么做(事物更改)

    SQLiteOpenHelper // 如果数据库文件不存在,只有onCreate()被调用(该方法在创建数据库时被调用一次) public abstract void onCreate(SQLite ...

  2. .NET题目(收集来自网络)

    1: .NET和c#有什么区别? 答: .NET一般是指.NET FrameWork框架,是一种平台,一种技术 c#是一种编程语言,是可以基于.NET平台的应用 2: c#中的委托是什么?事件是不是一 ...

  3. css实用属性

    background-size: 100% 100%;            背景通过拉伸实现填充 自适应 overflow: hidden;                              ...

  4. 阿里云 DTS 实践

    控制台 https://dts.console.aliyun.com/#/task/basic/ 操作 填写源目标和目的数据库信息 选择需要迁移的数据库 检查通过 现在好像是免费的,计时收费也很便宜 ...

  5. 实验5 Spark SQL编程初级实践

    今天做实验[Spark SQL 编程初级实践],虽然网上有答案,但都是用scala语言写的,于是我用java语言重写实现一下. 1 .Spark SQL 基本操作将下列 JSON 格式数据复制到 Li ...

  6. Oracle 查询表空间使用情况

    select *   from (Select a.tablespace_name,                to_char(a.bytes / 1024 / 1024, '99,999.999 ...

  7. 深入解析Java反射-invoke方法

    博客原文:http://www.sczyh30.com/posts/Java/java-reflection-2/ 上篇文章中回顾了一下Java反射相关的基础内容.这一节我们来深入研究Method类中 ...

  8. 【DFS】n皇后问题

    回溯: 递归调用代表开启一个分支,如果希望这个分支返回后某些数据恢复到分支开启前的状态以便重新开始,就要使用到回溯技巧,全排列的交换法,数独,部分和,用到了回溯.下一个状态在开始之前需要利用到之前的状 ...

  9. IntelliJ Idea 2017 免费激活方法

    1. 到网站 http://idea.lanyus.com/ 获取注册码. 2.填入下面的license server: http://intellij.mandroid.cn/ http://ide ...

  10. [Swift]LeetCode311. 稀疏矩阵相乘 $ Sparse Matrix Multiplication

    Given two sparse matrices A and B, return the result of AB. You may assume that A's column number is ...