[零] 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM