[零] 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
相關文章
相關標籤/搜索