天天看點

Java輸入輸出流和檔案操作

檔案是資訊的一種組織形式,是存儲在外部存儲媒體上的具有标志名的一組相關資訊集合。

檔案系統用檔案概念來組織和管理存放在各種媒體上的資訊。檔案系統提供目錄機制實作檔案的“按名存取”。

目錄是檔案系統組織和管理檔案的基本機關,目錄中儲存它所管理的每個檔案的基本屬性資訊(成為檔案目錄項或檔案控制塊)。除了檔案外,目錄中還可以包含子目錄和檔案,子目錄中還可以再有子目錄和檔案,由此構成目錄的多級樹狀結構。檔案是這種樹狀結構的葉子節點,檔案中不能包含另一個檔案。

在多級樹狀目錄結構中,一個檔案的全名由該檔案的路徑名和檔案名組成。一個檔案的路徑名由根目錄開始沿各級子目錄到達該檔案的路徑上的所有子目錄名組成。

檔案是檔案系統中最小的資料組織機關,目錄機制提供檔案之間的分類群組織方式。

檔案的組織是指檔案中資訊的配置和構造方式。檔案的組織包含兩方面:邏輯結構和存儲結構。檔案的邏輯結構是從使用者角度所觀察到的檔案中資訊的組織方式,檔案的存儲結構是檔案在外部存儲器上的實際存放方式。

按照檔案的邏輯結構,檔案可以劃分為兩大類:流式檔案和記錄式檔案。

流式檔案由位元組序列或字元序列組成。流式檔案内的資訊不再劃分結構,隻是具有順序關系的一系列位元組或字元集合,位元組或字元是資訊的最小機關。

記錄式檔案是一種有結構的檔案,包含若幹記錄。記錄是檔案中按資訊在邏輯上的獨立含義劃分的一個資訊機關,記錄在檔案中的排列具有順序關系。記錄是檔案内獨立的最小資訊機關,作業系統每次操作至少存儲、檢索或更新一個記錄。記錄可以被進一步劃分為若幹個更小的資料項,資料項是具有标志名的最小的不可分割的資料機關。資料項的集合構成記錄,相關記錄的集合構成檔案。對記錄的劃分及對資料項的類型描述,均由應用程式完成。

存取方式是作業系統為應用程式聽的使用檔案的技術手段。檔案類型、檔案的邏輯結構決定檔案的存取方式。檔案的存取方式主要有順序存取、随機存取和索引存取。

①順序存取是指按記錄順序進行讀/寫操作的存取方式。

②随機存取是指按記錄序号進行讀/寫操作的存取方式。

③索引存取是基于索引檔案的存取方法。由于檔案中的記錄不按它在檔案中的位置,而按它的記錄鍵來編址,是以使用者提供給作業系統記錄鍵後就可查找到所需記錄。

針對使用者和應用程式兩種不同的對象,作業系統通過操作接口和應用程式接口兩種方式提供其功能和服務,對檔案系統亦是如此。

①操作接口:作業系統将其功能和服務以操作指令形式提供給使用者,使用者以手動方式對檔案系統等進行操作,實作人機互動功能。

②應用程式接口:作業系統将其功能和服務以系統調用(system call)形式提供給應用程式。

流(stream)是指一組有順序的、有起點和終點的字元集合,是對資料傳輸的總稱和抽象。換言之,資料在兩個對象之間的傳輸稱為流。

對流進行讀/寫操作的最小機關是位元組,即一次可以寫入一位元組或者讀取一位元組。提高資料傳輸效率的辦法是,将一塊記憶體空間設計成緩沖區(buffer),暫時存放待傳送的資料,通過緩沖區可以一次讀/寫若幹位元組,緩沖區使資料能夠以較大的資料塊形式傳送,進而能夠顯著地提供資料傳輸效率。配備緩沖區的流成為緩沖流(buffered stream)。

設計流的作用是使資料傳輸操作獨立于相關裝置。程式需要根據待傳輸資料的不同特性而使用不同的流,資料傳輸給指定裝置後的操作由系統執行裝置驅動程式完成。

以下4種情況存在資料流動問題:

①控制台應用程式的标準輸入/輸出操作。

②檔案讀寫操作。

③線程通信。

④網絡通信。

按照流中元素的基本機關,流可分為位元組流(binary stream)和字元流(character stream)。按照流的方向性,流可分為輸入流和輸出流。每種流類都有輸入流和輸出流兩個類。

①位元組流以位元組為機關讀/寫流,用于傳輸非字元資料,如整數、浮點數,對象等。inputstream和outputstream是位元組輸入/輸出流的根類。

②字元流以字元為機關讀/寫流,僅用于傳輸字元,包括各種字元集。reader和write是字元輸入/輸出流的根類。

file檔案類記載檔案屬性資訊,randomaccessfile随機存取檔案類以随機存取方式進行檔案讀/寫操作。

從位元組流中讀取1位元組

輸出結果:

fileoutputstream類的write(int i)方法向位元組流寫入int整型i的低位一位元組,fileinputstream類的read()方法從位元組流中讀取1位元組,作為一個int整數的最低1位元組,并将該整數的高位3位元組補0。

從位元組流中讀取4位元組作為一個int整數

資料位元組流讀取操作:

把一個對象的表示轉換成一個位元組流的過程稱為序列化(serialization),反之,從位元組流中重建對象的過程稱為去序列化。對象能夠序列化的标記是該類實作java.io.serializable序列化接口,serializable是标記接口,其中沒有方法。如果要寫入的對象沒有實作序列化接口,則抛出java.io.notserializableexception異常。

管道位元組流實作發牌程式示例:

使用字元流讀寫文本檔案示例:

randomaccessfile随機存取檔案類以随機存取方式進行檔案讀/寫操作,對一個檔案可以同時進行既讀又寫的操作;在檔案指定位置讀取或者寫入基本資料類型。

轉載:http://blog.csdn.net/foreverling/article/details/46602089