《面向對象程序設計項目教程》課件 項目11 讀寫文件_第1頁
《面向對象程序設計項目教程》課件 項目11 讀寫文件_第2頁
《面向對象程序設計項目教程》課件 項目11 讀寫文件_第3頁
《面向對象程序設計項目教程》課件 項目11 讀寫文件_第4頁
《面向對象程序設計項目教程》課件 項目11 讀寫文件_第5頁
已閱讀5頁,還剩44頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

面向對象程序設計項目教程本章學習目標:●

掌握File類的使用●

掌握IO流的分類和體系結構●

掌握字符流和字節(jié)流的使用●

了解對象流和過濾流的使用●

了解NIO的特點并掌握Buffer和Channel的使用項目11讀寫文件任務1part了解I/O流

流是一組有序的數(shù)據(jù)序列,是實現(xiàn)數(shù)據(jù)輸入(Input)和輸出(Output)的基礎,可以對數(shù)據(jù)實現(xiàn)讀/寫操作。流(Stream)的優(yōu)勢在于使用統(tǒng)一的方式對數(shù)據(jù)進行操作或傳遞,簡化了代碼操作。按照不同的分類方式,可以將流分為不同的類型。

按照流的流向來分,可以將流分為輸入流和輸出流。輸入流是只能讀取數(shù)據(jù),而不能寫入數(shù)據(jù)的流;輸出流是只能寫入數(shù)據(jù),而不能讀取數(shù)據(jù)的流,如圖11.1所示。I/O流概述

按照流所操作的基本數(shù)據(jù)單元來分,可以將流分為字節(jié)流和字符流。字節(jié)流所操作的基本數(shù)據(jù)單元是8位的字節(jié)(byte),無論是輸入還是輸出,都是直接對字節(jié)進行處理;字符流所操作的基本數(shù)據(jù)單元是16位的字符(Unicode),無論是輸入還是輸出,都是直接對字符進行處理。

按照流的角色來分,可以將流分為節(jié)點流和處理流。節(jié)點流用于從或向一個特定的IO設備(如磁盤、網絡等)讀/寫數(shù)據(jù)的流,也稱為低級流,通常是指文件、內存或管道;處理流用于對一個已經存在的流進行連接或封裝,通過封裝后的流來實現(xiàn)數(shù)據(jù)的讀/寫功能,也稱為高級流或包裝流。I/O流概述Java的IO流都是由4個抽象基類派生的,如圖11.2所示。I/O流概述

其中:InputStream/Reader是所有輸入流的基類,用于實現(xiàn)數(shù)據(jù)的讀操作,前者是字節(jié)輸入流,后者是字符輸入流,只是處理的數(shù)據(jù)基本單位不同;OutputStream/Writer是所有輸出流的基類,用于實現(xiàn)數(shù)據(jù)的寫操作,前者是字節(jié)輸出流,后者是字符輸出流,只是處理的數(shù)據(jù)基本單位不同。Java的IO流體系按照功能分類,常用的流如表11-1所示。其中,訪問文件、數(shù)組、管道和字符串的流都是節(jié)點流,必須直接與指定的物理節(jié)點關聯(lián)。I/O流概述任務2part掌握File類的應用File類File類是java.io包下代表與平臺無關的文件和目錄,也就是說,如果希望在程序中操作文件和目錄,都可以通過File類來完成。File類中的方法可以實現(xiàn)文件和目錄的創(chuàng)建、刪除和重命名等,但File類不能訪問文件內容本身。如果需要訪問文件內容本身,則需要使用輸入/輸出流。File類可以使用文件路徑字符串來創(chuàng)建File實例,該文件路徑字符串既可以是絕對路徑,也可以是相對路徑。絕對路徑是從根目錄開始,對文件進行完整描述,例如“D:\data\xsc.txt”;相對路徑是以當前目錄為參照,對文件進行描述,例如“data\xsc.txt”。File類File類File類常用方法及功能如表11-2所示。任務3part實現(xiàn)字節(jié)流讀寫3.1InputStreamInputStream是字節(jié)輸入流,使用InputStream可以從數(shù)據(jù)源以字節(jié)為單位進行讀取數(shù)據(jù)。InputStream類中的常用方法如表11-3所示。3.1InputStreamInputStream類是抽象類,不能直接實例化,因此使用其子類來完成具體功能。InputStream類及其子類的關系如圖11.3所示。3.1InputStreamInputStream常見子類及其功能描述如表11-4所示。3.2OutputStreamOutputStream是字節(jié)輸出流,使用OutputStream可以往數(shù)據(jù)源以字節(jié)為單位寫入數(shù)據(jù)。OutputStream常用方法如表11-5所示。3.2OutputStreamOutputStream類和InputStream類一樣,都是抽象類,不能直接實例化,因此也是使用其子類來完成具體功能。OutputStream類及其子類的關系如圖11.4所示。3.2OutputStreamOutputStream常見子類及其功能描述如表11-4所示。任務4part實現(xiàn)字符流讀寫4.1ReaderReader是字符輸入流,用于從數(shù)據(jù)源以字符為單位進行讀取數(shù)據(jù)。Reader類中常用方法及功能描述如表11.5所示。4.1ReaderReader類是抽象類,不能直接實例化,因此使用其子類來完成具體功能。Reader類及其子類的關系如圖11.5所示。4.1ReaderReader類常用子類及其功能描述如表11.6所示。4.2WriterReader是字符輸入流,用于從數(shù)據(jù)源以字符為單位進行讀取數(shù)據(jù)。Reader類中常用方法及功能描述如表11.5所示。4.2WriterWriter類是抽象類,不能直接實例化,因此使用其子類來完成具體功能。Writer類及其子類的關系如圖11.6所示。任務5part實現(xiàn)過濾流和轉換流讀寫5.1過濾流

過濾流用于對一個已有的流進行連接和封裝處理,以更加便利的方式對數(shù)據(jù)進行讀/寫操作。過濾流又分為過濾輸入流和過濾輸出流。FilterInputStream為過濾輸入流,該類的子類如圖11.7所示。5.1過濾流FilterInputStream各個子類的功能描述如表11-8所示。5.1過濾流FilterOutputStream類為過濾輸出流,其子類的層次關系如圖11.8所示。FilterOutputStream類各個子類的功能如表11-9所示。5.2轉換流Java的IO流體系中提供了兩個轉換流:

●InputStreamReader:將字節(jié)輸入流轉換成字符輸入流。

●OutputStreamWriter:將字符輸出流轉換成字節(jié)輸出流。任務6part實現(xiàn)對象流讀寫6.1對象序列化與反序列化

對象的序列化(Serialize)是指將對象數(shù)據(jù)寫到一個輸出流中的過程;而對象的的反序列化是指從一個輸入流中讀取一個對象。將對象序列化后會轉換成與平臺無關的二進制字節(jié)流,從而允許將二進制字節(jié)流持久地保存在磁盤上,或通過網絡將二進制字節(jié)流傳輸?shù)搅硪粋€網絡節(jié)點;其他程序從磁盤或網絡中獲取這種二進制字節(jié)流,并將其反序列化后恢復成原來的Java對象。6.1對象序列化與反序列化

對象序列化具有以下兩個特點:

●對象序列化可以在分布式應用中進行使用,分布式應用需要跨平臺、跨網絡,因此要求所有傳遞的參數(shù)、返回值都必須實現(xiàn)序列化;

●對象序列化不僅可以保存一個對象的數(shù)據(jù),而且通過循環(huán)可以保存每個對象的數(shù)據(jù)。

對象序列化和反序列化過程如圖11.9所示。11.6.1對象序列化與反序列化

在Java中,如果需要將某個對象保存到磁盤或通過網絡傳輸,則該對象必須是可以序列化的(serializable)。一個類的對象是可序列化的,則該類必須實現(xiàn)java.lang包下的Serializable接口或Externalizable接口。Java中的很多類已經實現(xiàn)了Serializable接口,該接口只是一個標志接口,接口中沒有任何的方法。實現(xiàn)Serializable接口時無須實現(xiàn)任何方法,它只是用于表明該類的實例對象是可以序列化的。只有實現(xiàn)Serializable接口的對象才可以利用序列化工具保存和復原。6.2ObjectInputStream和ObjectOutputStreamObjectOutputStream是OutputStream的子類,該類也實現(xiàn)了ObjectOutput接口,其中ObjectOutput接口支持對象序列化。該類的一個構造方法如下:ObjectOutputStream(OutputStreamoutStream)throwsIOException{}其中參數(shù)outStream是被寫入序列化對象的輸出流。ObjectOutputStream類的常用方法及其功能如表11-10所示。6.2ObjectInputStream和ObjectOutputStreamObjectInputStream是InputStream的子類,該類也實現(xiàn)了ObjectInput接口,其中ObjectInput接口支持對象序列化。該類的一個構造方法如下:ObjectInputStream(InputStreaminputStream)throwsIOException{}其中inputStream參數(shù)是讀取序列化對象的輸入流。ObjectInputStream類的常用方法及其功能如表11-11所示。任務7part了解NIO7.1NIO概述NIO和傳統(tǒng)的IO有相同的目的,都是用于數(shù)據(jù)的輸入/輸出,但NIO采用了內存映射文件這種與原來不同的方式來處理輸入/輸出操作。Java中與NIO相關的有以下幾個包:

●java.nio包:主要包含各種與Buffer(緩沖)相關的類;

●java.nio.channels包:主要包含與Channel(通道)和Selector相關的類;

●java.nio.charset包:主要包含與字符集相關的類;

●java.nio.channels.spi包:主要包含與Channel相關的服務提供者編程接口;

●java.nio.charset.spi包:主要包含與字符集相關的服務提供者編程接口。7.1NIO概述Buffer和Channel是NIO中兩個核心對象:

●Buffer可以被理解成一個容器,其本質是一個數(shù)組,往Channel中發(fā)送或讀取的對象都必須先放到Buffer中。

●Channel是對傳統(tǒng)的IO系統(tǒng)的模擬,在NIO系統(tǒng)中所有數(shù)據(jù)都需要經過通道傳輸。Channel與傳統(tǒng)的InputStream、OutputStream最大的區(qū)別是提供一個map()方法,通過該方法可以直接將一塊數(shù)據(jù)映射到內存中。傳統(tǒng)的IO是面向流的處理,而NIO則是面向塊的處理。除了Buffer和Channel之外,NIO還提供了用于將Unicode字符串映射成字節(jié)序列以及映射操作的Charset類,也提供了支持非阻塞方式的Selector類。7.2BufferBuffer是一個抽象類,其最常使用的子類是ByteBuffer,用于在底層字節(jié)數(shù)組上進行get/set操作。除了布爾類型之外,其他基本數(shù)據(jù)類型都有對應的Buffer類,例如,CharBuffer、ShortBuffer、IntBuffer等。這些Buffer類都沒有提供構造方法,而是通過下面一個靜態(tài)方法來獲得一個Buffer對象:StaticXxxBufferallocate(intcapacity)://創(chuàng)建一個指定容量的XxxBuffer對象

通常使用最多的是ByteBuffer和CharBuffer,而其他Buffer則很少使用。其中,ByteBuffer類還有一個名為“MappedByteBuffer”的子類,用于表示Channel將磁盤文件的部分或全部內容映射到內存中所得到的結果,通常MappedByteBuffer對象由Channel的map()方法返回。7.2BufferBuffer還支持一個可選的標記mark,Buffer允許直接將position定位到該mark處。Capacity、limit、position和mark這些值之間滿足以下關系:0<=mark<=position<=limit<=capacityBuffer讀入數(shù)據(jù)后如圖11.10所示。7.2BufferBuffer常用的方法如表11-12所示。7.3ChannelChannel與傳統(tǒng)的IO流類似,但主要有兩點區(qū)別:

●Channel類可以直接將指定文件的部分或全部直接映射成Buffer;

●程序不能直接訪問Channel中的數(shù)據(jù),Channel只能與Buffer進行交互。Channel是接口,其實現(xiàn)類包括:DatagramChannel、FileChannel、Pipe.SinkChannel、Pipe.SourceChannel、SelectableChannel、ServerSocketChannel、SocketChannel等。所有的Channel對象都不是通過構造方法直接創(chuàng)建,而是通過傳統(tǒng)的節(jié)點InputStream或OutputStream的getChannel()方法來獲取對應的Channel對象,不同的節(jié)點流所獲取的Channel也是不一樣的。例如,F(xiàn)ileInputStream和FileOutputStream的getChannel()方法返回的是FileChannel,而PipeInputStream和PipeOutputStream的getChannel()方法返回的是Pipe.SourceChannel。7.3Channel

在本章節(jié)中,以FileChannel為例,介紹如何使用Channel進行數(shù)據(jù)訪問。FileChannel類中常用的方法如表11-13所示。7.4字符集和CharsetJDK1.4提供了Charset來處理字節(jié)序列和字符序列(字符串)之間的轉換關系,該類包含了用于創(chuàng)建解碼器和編碼器的方法,還提供了獲取Charset所支持字符集的方法。Charset類常用方法如表11-14所示。7.5文件鎖

在NIO中,Java提供了FileLock類來支持文件鎖定功能,在FileChannel類中提供了Lock()/tryLock()方法來獲得文件鎖對象,從而鎖定文件。FileChannel類常用的方法如表11-15所示。7.5文件鎖

當參數(shù)shared為true時,表明該鎖是一個共享鎖,它將允許多個進程來讀取該文件,但阻止其他進程獲得對該文件的排他鎖。當shared為false時,表明該鎖是一個排他鎖,它將鎖住對該文件的讀寫。程序可以通過FileLock類的isShared()方法來判斷它獲得的鎖是否為共享鎖。處理完文件后通過FileLock了的release()方法來釋放文件鎖。Lock()方法和tryLoc()方法的區(qū)別在于:當lock()試圖鎖定某個文件時,如果無法

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論