面向對象-教案(第29講)文本IO流;(第30講)對象序列化_第1頁
面向對象-教案(第29講)文本IO流;(第30講)對象序列化_第2頁
面向對象-教案(第29講)文本IO流;(第30講)對象序列化_第3頁
面向對象-教案(第29講)文本IO流;(第30講)對象序列化_第4頁
面向對象-教案(第29講)文本IO流;(第30講)對象序列化_第5頁
已閱讀5頁,還剩4頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

《面向對象程序設計》教案第29講教學對象計算機科學技術專業授課內容11.4文本I/O流11.5案例學習——統計文件字符數、單詞數和行數課程標準教學目標(一)知識目標1.了解字符輸入/輸出流的層次結構和常用方法2.掌握文件字符輸入/輸出流類的使用方法3.掌握緩存字符輸入/輸出流類的使用方法(二)能力目標1.能夠應用字符流進行文件讀寫操作2.能夠根據實際需要正確選擇IO流完成讀寫操作教學方法采用講授法、演示法、討論法、案例教學。學時及分配(第1學時50分鐘)課堂講授30分鐘課堂練習20分鐘11.4文本I/O流學時及分配(第2學時50分鐘)課堂講授20分鐘課堂練習30分鐘11.5案例學習——統計文件字符數、單詞數和行數知識點分析重點:Reader類和Writer類的常用方法FileReader類和FileWriter類的常用方法BufferedReader類和BufferedWirter類的常用方法難點:應用FileReader類和FileWriter類讀寫數據應用BufferedReader類和BufferedWirter類讀寫數據教學過程設計內容方式問題導入上節學習的二進制輸入/輸出流是以字節為信息的基本單位,本節學習以字符為基本單位的文本I/O流,也叫字符I/O流。內容要點11.4文本I/O流11.4.1Writer類和Reader類抽象類Writer和Reader分別是文本輸出流和輸入流的根類,它們實現字符的寫讀。Writer類定義的常用方法如下。publicvoidwrite(intc):向輸出流中寫一個字符,實際是將int型的c的低16位寫入輸出流。publicvoidwrite(char[]cbuf):把字符數組cbuf中的字符寫入輸出流。publicvoidwrite(Stringstr):把字符串str寫入輸出流中。publicvoidflush():刷新輸出流。publicvoidclose():關閉輸出流。Reader類定義的方法主要有:publicintread():讀取一個字符,返回范圍為0到65535之間int型值,如果到達流的末尾返回-1。publicintread(char[]cbuf):讀取多個字符到字符數組cbuf中,如果到達流的末尾返回-1。publicvoidclose():關閉輸入流。Writer類和Reader類的方法在發生I/O錯誤時都拋出IOException異常,因此在程序中應該捕獲異常或聲明拋出異常。11.4.2FileWriter類和FileReader類FileWriter類是文件輸出流,FileReader類是文件輸入流。當操作的文件中是文本數據時,推薦使用這兩個類。FileWriter類構造方法有:publicFileWriter(StringfileName):用參數fileName指定的文件創建一個文件輸出流對象。publicFileWriter(Filefile):用參數file指定的File對象創建一個文件輸出流對象。publicFileWriter(StringfileName,booleanappend):使用該構造方法創建文件輸出流對象時,如果參數appent指定為true,則可以向文件末尾追加數據,否則覆蓋文件原來的數據。FileReader類構造方法有:publicFileReader(StringfileName):用字符串表示的文件構造一個文件輸入流對象。publicFileReader(Filefile):用File對象表示的文件構造一個文件輸入流對象。FileWriter類是OutputStreamWriter的子類,它實現文本輸出流向二進制輸出流的轉換;FileReader類是InputStreamReader的子類,它實現二進制輸入流向文本輸入流的轉換功能。下面的FileCopyDemo.java程序使用FileReader和FileWriter將文件input.txt的內容復制到output.txt文件中。【程序11-8】FileCopyDemo.java11.4.3BufferedWriter類和BufferedReader類BufferedWriter類和BufferedReader類分別實現了具有緩沖功能的文本輸入輸出流。這兩個類用來將其他的文本流包裝成緩沖文本流,以提高讀寫數據的效率。BufferedWriter類的構造方法如下:BufferedWriter(Writerout):使用默認的緩沖區大小創建緩沖文本輸出流。BufferedWriter(Writerout,intsz):使用指定的緩沖區大小創建緩沖文本輸出流。該類提供了一個voidnewLine()方法,用來寫一個行分隔符。它是系統屬性line.separator定義的分隔符。通常Writer直接將輸出發送到基本的字符或字節流,建議在Writer上(如FileWriter和OutputStreamWriter)包裝BufferedWriter,例如:varbr=newBufferedWriter(newFileWriter("output.txt"));BufferedReader類的構造方法如下:publicBufferedReader(Readerin):使用默認的緩沖區大小創建緩沖文本輸入流。publicBufferedReader(Readerin,intsz):使用指定的緩沖區大小創建緩沖文本輸入流。下面代碼創建了一個BufferedReader對象:varin=newBufferedReader(newFileReader("input.txt"));BufferedReader類還定義了readLine()方法用于從輸入流中讀取一行文本。下面程序用BufferedReader類讀取文本文件article.txt,統計文件中的單詞數量。【程序11-9】WordsCount.java11.4.4PrintWriter類PrintWriter類實現文本打印輸出流,它的構造方法如下:PrintWriter(Writerout):使用參數指定的輸出流對象out創建一個打印輸出流。PrintWriter(Writerout,booleanautoFlush):如果autoFlush指定為true,則在輸出之前自動刷新輸出流。PrintWriter(OutputStreamout):使用二進制輸出流創建一個打印輸出流。PrintWriter(OutputStreamout,booleanautoFlush):如果autoFlush指定為true,則在輸出之前自動刷新輸出流。PrintWriter類定義的常用方法有:publicvoidprintln(booleanb):輸出一個boolean型數據。publicvoidprintln(charc):輸出一個char型數據。publicvoidprintln(char[]s):輸出一個char型數組數據。publicvoidprintln(inti):輸出一個int型數據。publicvoidprintln(longl):輸出一個long型數據。publicvoidprintln(floatf):輸出一個float型數據。publicvoidprintln(doubled):輸出一個double型數據。publicvoidprintln(Strings):輸出一個String型數據。publicvoidprintln(Objectobj):將obj轉換成String型數據,然后輸出。publicPrintWriterprintf(Stringformat,Object…args):使用指定的格式format,輸出args參數指定的數據。這些方法都是把數據轉換成字符串然后輸出。下面程序隨機產生10個100到200之間的整數,然后使用PrintWriter對象輸出到文件number.txt中。之后再從文件中讀出這10個數。【程序11-10】PrintWriterDemo.java11.4.5使用Scanner對象使用Scanner類從鍵盤讀取數據,這是在創建Scanner對象時將標準輸入設備System.in作為其構造方法的參數。使用Scanner還可以關聯文本文件,從文本文件中讀取數據。Scanner類的常用的構造方法有:publicScanner(Stringsource):用指定的字符串構造一個Scanner對象,以便從中讀取數據。publicScanner(InputStreamsource):用指定的輸入流構造一個Scanner對象,以便從中讀取數據。創建Scanner對象后,就可以根據分隔符對源數據進行解析。使用Scanner類的有關方法可以解析出每個標記(token)。默認的分隔符是空白,包括回車、換行、空格和制表符等,也可以指定分隔符。Scanner類的常用方法如下所示:publicbytenextByte():讀取下一個標記并將其解析成byte型數。publicshortnextShort():讀取下一個標記并將其解析成short型數。publicintnextInt():讀取下一個標記并將其解析成int型數。publiclongnextLong():讀取下一個標記并將其解析成long型數。publicfloatnextFloat():讀取下一個標記并將其解析成float型數。publicdoublenextDouble():讀取下一個標記并將其解析成double型數。publicbooleannextBoolean():讀取下一個標記并將其解析成boolean型數。publicStringnext():讀取下一個標記并將其解析成字符串。publicStringnextLine():讀取當前行作為一個String型字符串。publicScanneruseDelimiter(Stringpattern):設置Scanner對象使用的分隔符的模式。pattern為一個合法的正則表達式。publicvoidclose():關閉Scanner對象。下面程序使用Scanner類從程序11-10創建的文本文件number.txt中讀出每個整數。【程序11-11】TextFileDemo.java11.5案例學習——統計文件字符數、單詞數和行數1.問題描述經常需要對一個文本文件分析,比如在其中查找有關內容,進行某種統計等。本案例要求編寫程序,統計一個英文文本文件中的字符數、單詞數和行數。單詞由空格和逗號、句號、分號和感嘆號這4個標點符號分隔,文件名由鍵盤讀入。2.設計思路java.util.Scanner類可以從控制臺讀取字符串,可以用它讀取文件名。讀取文件內容可以使用文本輸入流對象FileReader。對讀取的每行可以使用split()方法解析,從而得到單詞數量。由此,本案例的設計思路如下:(1)創建Scanner對象,從鍵盤讀取要統計的源文件名,并判斷文件是否存在,存在繼續,不存在則強制程序結束。(2)創建FileReader和BufferedReader對象,使用readLine()方法從指定的文件讀取字符串進行解析。(3)對每一行的字符串,用String的length()方法計算字符數,再使用String類的split()方法根據置分隔符來解析所包含的單詞數。3.代碼實現【程序11-12】WordsCount.java采用機房授課邊講邊練,同時用啟發式、討論式、案例教學等教學方法。布置課外學習任務思考題:教材習題:簡答題5編程題:完成案例學習全部代碼教材習題:編程題6教學反思《面向對象程序設計》教案第30講教學對象計算機科學技術專業授課內容11.6對象序列化編程實踐課程標準教學目標(一)知識目標1.理解對象序列化和反序列化的概念2.靈活應用字節流和字符流(二)能力目標1.能夠熟練使用字節流和字符流進行文件的讀寫操作2.能夠熟練使用File類完成文件和目錄的操作教學方法采用講授法、演示法、討論法、案例教學。學時及分配(第1學時50分鐘)課堂講授30分鐘課堂練習20分鐘11.6對象序列化學時及分配(第2學時50分鐘)課堂講授20分鐘課堂練習30分鐘編程實踐知識點分析重點:字符流和字節流的基本操作File類的使用難點:字符緩沖流和字節緩沖流序列化和反序列化教學過程設計內容方式問題導入有時需要將對象持久化到永久存儲設備中,以便保存對象的狀態供以后檢索。Java通過對象序列化(objectserialization)支持這一點。要序列化對象,即將其保存到永久存儲設備中,可以使用ObjectOutputStream。要反序列化(deserialize)對象,即檢索保存的對象,可使用ObjectInputStream。內容要點11.6.1對象序列化與對象流將程序中的對象輸出到外部設備(如磁盤、網絡)中,稱為對象序列化(serialization)。反之,從外部設備將對象讀入程序中稱為對象反序列化(deserialization)。一個類的對象要實現對象序列化,必須實現java.io.Serializable接口,該接口的定義如下。publicinterfaceSerializable{}Serializable接口只是標識性接口,其中沒有定義任何方法。一個類的對象要序列化,除了必須實現Serializable接口外,還需要創建對象輸出流和對象輸入流,然后,通過對象輸出流將對象狀態保存下來,通過對象輸入流恢復對象的狀態。要序列化的類如果沒有實現該接口,在序列化時將拋出java.io.NotSerializableException異常。在java.io包中定義了兩個類ObjectInputStream和ObjectOutputStream,分別稱為對象輸入流和對象輸出流。ObjectInputStream類繼承了InputStream類,實現了ObjectInput接口,而ObjectInput接口又繼承了DataInput接口。ObjectOutputStream類繼承了OutputStream類,實現了ObjectOutput接口,而ObjectOutput接口又繼承了DataOutput接口。11.6.2向ObjectOutputStream中寫對象若將對象寫到外部設備需要建立ObjectOutputStream類的對象,構造方法為:publicObjectOutputStream(OutputStreamout)參數out為一個字節輸出流對象。創建了對象輸出流后,就可以調用它的writeObject()方法將一個對象寫入流中,該方法格式為:publicfinalvoidwriteObject(Objectobj)throwsIOException若寫入的對象不是可序列化的,該方法會拋出NotSerializableException異常。由于ObjectOutputStream類實現了DataOutput接口,該接口中定義多個方法用來寫入基本數據類型,如writeInt()、writeFloat()及writeDouble()等,可以使用這些方法向對象輸出流中寫入基本數據類型。下面代碼將一些數據和對象寫到對象輸出流中。varfos=newFileOutputStream("data.ser");varoop=newObjectOutputStream(fos);可向對象流中寫基本類型和各種對象oos.writeInt(2022);可向對象流中寫基本類型和各種對象oos.writeObject("你好");oos.writeObject(LocalDate.now());ObjectOutputStream必須建立在另一個字節流上,該例是建立在FileOutputStream上的。然后向文件中寫入一個整數、字符串“你好”和一個LocalDate對象。11.6.3從ObjectInputStream中讀對象若要從外部設備上讀取對象,需建立ObjectInputStream對象,該類的構造方法為:publicObjectInputStream(InputStreamin)參數in為字節輸入流對象。通過調用ObjectInputStream類的方法readObject()方法可以將一個對象讀出,該方法的聲明格式為:publicfinalObjectreadObject()throwsIOException在使用readObject()方法讀出對象時,其類型和順序必須與寫入時一致。由于該方法返回Object類型,因此在讀出對象時需要適當的類型轉換。ObjectInputStream類實現了DataInput接口,該接口中定義了讀取基本數據類型的方法,如readInt()、readFloat()及readDouble(),使用這些方法可以從ObjectInputStream流中讀取基本數據類型。下面代碼在InputStream對象上建立一個對象輸入流對象。varfis=newFileInputStream("data.ser");varoip=newObjectInputStream(fis);inti=ois.readInt();Stringtoday=(String)oi

溫馨提示

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

評論

0/150

提交評論