版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第第10講講 文件與輸入輸出流文件與輸入輸出流(2)字符流字符流對象序列化對象序列化文件隨機存取文件隨機存取Excel文檔的讀寫文檔的讀寫(了解了解)教學目標教學目標n 熟悉字符流類的繼承關(guān)系,掌握常用字符流的讀寫操作及包熟悉字符流類的繼承關(guān)系,掌握常用字符流的讀寫操作及包裝流的使用;裝流的使用;n 熟悉熟悉RandomAccessFile類,掌握文件隨機讀寫方法;類,掌握文件隨機讀寫方法;n 理解對象序列化的意義,熟悉對象序列化、反序列化的基本理解對象序列化的意義,熟悉對象序列化、反序列化的基本方法;方法;n 了解了解Excel文件的相關(guān)操作。文件的相關(guān)操作。n 重點:重點:常用字符流的讀寫
2、操作、包裝流的使用、常用字符流的讀寫操作、包裝流的使用、RandomAccessFile類使用、對象序列化的意義、對象序列類使用、對象序列化的意義、對象序列化、反序列化的基本方法;化、反序列化的基本方法;n 難點:字符流與字節(jié)流的異同點,包裝流的使用、隨機讀寫難點:字符流與字節(jié)流的異同點,包裝流的使用、隨機讀寫文件與輸入輸出流的比較、對象序列化的操作,文件與輸入輸出流的比較、對象序列化的操作,Excel等文等文件操作件操作1. 字符流字符流字節(jié)流雖然可以處理字符串,但并不方便:字節(jié)流雖然可以處理字符串,但并不方便:n “寫入寫入”時,需先將字符串調(diào)用時,需先將字符串調(diào)用getBytes()編譯
3、成字節(jié)數(shù)組,編譯成字節(jié)數(shù)組,再寫入字節(jié)數(shù)組內(nèi)容;再寫入字節(jié)數(shù)組內(nèi)容;n “讀取讀取”時,為解決亂碼問題,需要調(diào)用時,為解決亂碼問題,需要調(diào)用new String(字節(jié)數(shù)字節(jié)數(shù)組,起始位置,長度組,起始位置,長度)生成字符串后,再輸出;生成字符串后,再輸出;所以,從所以,從JDK1.1開始,開始, 引入了字符流專門用于文本的處理引入了字符流專門用于文本的處理。 (1) 為什么引入字符流為什么引入字符流?l 進行字符處理時,涉及不同字符編碼轉(zhuǎn)換問題:進行字符處理時,涉及不同字符編碼轉(zhuǎn)換問題:字符流中涉及的類不少,現(xiàn)選擇幾個有代表性較實用的類來介紹:字符流中涉及的類不少,現(xiàn)選擇幾個有代表性較實用的類
4、來介紹:字符輸入流類示圖字符輸入流類示圖字符輸出流類示圖字符輸出流類示圖n Reader和和Writer兩個類分別是字符輸入流、字符輸出流的基兩個類分別是字符輸入流、字符輸出流的基類,它們也是抽象類,當然不能實例化對象類,它們也是抽象類,當然不能實例化對象。n 它們聲明了一些重要方法,這些方法在子類中具體實現(xiàn)它們聲明了一些重要方法,這些方法在子類中具體實現(xiàn)n Reader類的基本方法類的基本方法:1)read():從輸入流中讀取數(shù)據(jù)。有:從輸入流中讀取數(shù)據(jù)。有3種格式:種格式: int read():從輸入流中讀一個字從輸入流中讀一個字符。返回值符。返回值是所讀取的字是所讀取的字符符內(nèi)內(nèi)容容,
5、轉(zhuǎn)化為轉(zhuǎn)化為065535范圍的整數(shù)范圍的整數(shù)int read(char cbuf):從輸入流中讀取多個字符,并將這些字:從輸入流中讀取多個字符,并將這些字符存放到數(shù)組符存放到數(shù)組cbuf中,返回值是實際讀取的字符個數(shù)中,返回值是實際讀取的字符個數(shù)int read(char cbuf, int off, int len):從輸入流一次讀取從輸入流一次讀取len個字符的數(shù)據(jù),并寫入數(shù)組個字符的數(shù)據(jù),并寫入數(shù)組cbuf中,數(shù)據(jù)從下標為中,數(shù)據(jù)從下標為off的數(shù)組的數(shù)組元素位置開始存放。返回值也是實際讀取的字符個數(shù)元素位置開始存放。返回值也是實際讀取的字符個數(shù)對于這三個方法,如果讀指針到達輸入流尾部,
6、將返回如果讀指針到達輸入流尾部,將返回-1 。(2) 字符流的基類字符流的基類2) void close():關(guān)閉輸入流,并釋放與該輸入流有關(guān)的系關(guān)閉輸入流,并釋放與該輸入流有關(guān)的系統(tǒng)資源。統(tǒng)資源。3) boolean ready():輸入流是否做好讀取準備。注意:字符:輸入流是否做好讀取準備。注意:字符流中無流中無int available()方法。方法。4) long skip(long n):從輸入流中跳過:從輸入流中跳過n個字符。個字符。5)boolean markSupported():測試輸入流是否支持:測試輸入流是否支持“標記標記”和和“復位復位”操作。操作。6) void ma
7、rk(int readlimit):在輸入流的當前位置進行標記,:在輸入流的當前位置進行標記,以便重新讀取數(shù)據(jù)。以便重新讀取數(shù)據(jù)。7) void reset():使輸入流讀指針重新復位到剛剛標記的位置:使輸入流讀指針重新復位到剛剛標記的位置處。處。l Writer類的基本方法類的基本方法:1)write():向輸出流寫入數(shù)據(jù)。有:向輸出流寫入數(shù)據(jù)。有5種格式:種格式:void write(int c):將整數(shù)寫入輸出流中。寫入的內(nèi)容是整數(shù)的將整數(shù)寫入輸出流中。寫入的內(nèi)容是整數(shù)的低低16位數(shù)據(jù),高位數(shù)據(jù),高16位被忽略。該方法無返回值;位被忽略。該方法無返回值;void write(char c
8、buf):將字符數(shù)組將字符數(shù)組cbuf的數(shù)據(jù)寫入到輸出流的數(shù)據(jù)寫入到輸出流中。該方法的效率比高;中。該方法的效率比高;void write(char cbuf, int off, int len):將字符數(shù)組:將字符數(shù)組cbuf中從中從下標從下標從off開始、長度為開始、長度為len的字符寫入到輸出流中。的字符寫入到輸出流中。void write(String str):向輸出流寫入字符串:向輸出流寫入字符串str。void write(String str, int off, int len):將從位置:將從位置off開始、長度開始、長度為為len的字符串寫入輸出流中的字符串寫入輸出流中。上
9、述方法在寫入數(shù)據(jù)時出錯,將拋出上述方法在寫入數(shù)據(jù)時出錯,將拋出IOException異常。異常。2) void close():關(guān)閉輸出流,并釋放與該輸出流相關(guān)的系統(tǒng)資源。關(guān)閉輸出流,并釋放與該輸出流相關(guān)的系統(tǒng)資源。3) void flush():將緩沖區(qū)中的數(shù)據(jù)強制進行寫操作,刷新輸出緩:將緩沖區(qū)中的數(shù)據(jù)強制進行寫操作,刷新輸出緩沖區(qū)。沖區(qū)。n Reader和和Writer三組有代表性的子類三組有代表性的子類l 實現(xiàn)從實現(xiàn)從“字節(jié)字節(jié)”到到“字符字符”轉(zhuǎn)換的字符流:轉(zhuǎn)換的字符流:InputStreamReader(InputStream in)OutputStreamWriter(Outpu
10、tStream out);l 以以“行行”為讀取、寫入單位的字符流:為讀取、寫入單位的字符流:BufferedReader(Reader in)BufferedWriter(Writer out);l 與文件相關(guān)的字符流:與文件相關(guān)的字符流:FileReader(File file或或String filename)FileWriter(File file或或String filename)n 這這兩個類充當著字節(jié)流和字符流之間轉(zhuǎn)換的橋梁充當著字節(jié)流和字符流之間轉(zhuǎn)換的橋梁;(3) InputStreamReader和和OutputStreamWriter類類n 常用的構(gòu)造方法:常用的構(gòu)造方法:
11、1) InputStreamReader(InputStream in):使用系統(tǒng)默認的字:使用系統(tǒng)默認的字符集生成字符輸入流符集生成字符輸入流2) InputStreamReader(InputStream in, String charsetName):使用用戶指定的字符集生成字符輸入流:使用用戶指定的字符集生成字符輸入流n 常用方法常用方法除了基類除了基類Reader、或、或Wirter定義的方法定義的方法read()或或write()方法外,方法外,還包含以下兩個方法:還包含以下兩個方法:1) void close():關(guān)閉輸入流關(guān)閉輸入流/輸出流輸出流2) String getEnc
12、oding():返回轉(zhuǎn)換時所用的字符集返回轉(zhuǎn)換時所用的字符集3) OutputStreamWriter(OutputStream out):使用系統(tǒng)默認:使用系統(tǒng)默認的字符集生成字符輸出流的字符集生成字符輸出流4) OutputStreamWriter(OutputStream out, String charsetName):使用用戶指定的字符集生成字符輸出流:使用用戶指定的字符集生成字符輸出流n 應用舉例應用舉例1)先創(chuàng)建文件字節(jié)輸出流,再用先創(chuàng)建文件字節(jié)輸出流,再用OutputStreamWriter包裝成字符包裝成字符輸出流,之后用幾種方式向文件寫入一個或多個字符:輸出流,之后用幾種方
13、式向文件寫入一個或多個字符:2)創(chuàng)建文件字節(jié)輸入流,再用創(chuàng)建文件字節(jié)輸入流,再用InputStreamReader包裝成字符輸包裝成字符輸入流,然后讀取輸入流內(nèi)容,并顯示、輸出。入流,然后讀取輸入流內(nèi)容,并顯示、輸出。/例例1 InputStreamReader和和OutputStreamWriter類的應用類的應用 主要代碼:主要代碼:String str1 = 大學大學;char cbuf = new charstr1.length();str1.getChars(0, str1.length(), cbuf, 0);/ 將字符串將字符串str1內(nèi)容存放到字符數(shù)組內(nèi)容存放到字符數(shù)組cbuf
14、String str2 = 華軟軟件學院華軟軟件學院;/ 先創(chuàng)建文件字節(jié)輸出流先創(chuàng)建文件字節(jié)輸出流,再創(chuàng)建字符輸出流再創(chuàng)建字符輸出流FileOutputStream fos = new FileOutputStream(char.txt);OutputStreamWriter osw = new OutputStreamWriter(fos);/ 以多種方式寫入字符數(shù)據(jù)以多種方式寫入字符數(shù)據(jù)osw.write(廣廣);/ 寫入一個字符寫入一個字符osw.write(州州);/ 寫入一個字符寫入一個字符osw.write(cbuf);/ 寫入字符數(shù)組內(nèi)容寫入字符數(shù)組內(nèi)容osw.write(str
15、2);/ 寫入字符串內(nèi)容寫入字符串內(nèi)容osw.close();/ 先創(chuàng)建文件字節(jié)輸入流先創(chuàng)建文件字節(jié)輸入流,再創(chuàng)建字符輸入流再創(chuàng)建字符輸入流FileInputStream fis = new FileInputStream(char.txt);InputStreamReader isr = new InputStreamReader(fis);/ 定義一個能存放定義一個能存放str1和和str2的字符數(shù)組的字符數(shù)組char mychars = new charstr1.length() + str2.length();System.out.print(char) isr.read();/ 以字
16、符方式讀取第以字符方式讀取第1個字符個字符,并輸出并輸出System.out.print(char) isr.read();/ 以字符方式讀取第以字符方式讀取第2個字符個字符,并輸出并輸出/ 以字符數(shù)組方式讀取剩余字符以字符數(shù)組方式讀取剩余字符int len = isr.read(mychars, 0, str1.length() + str2.length();/ 將字符數(shù)組內(nèi)容以系統(tǒng)默認字符集生成字符串將字符數(shù)組內(nèi)容以系統(tǒng)默認字符集生成字符串,并輸出并輸出System.out.print(new String(mychars, 0, len);isr.close();程序運行結(jié)果:廣州大學
17、華軟軟件學院程序運行結(jié)果:廣州大學華軟軟件學院小結(jié):這一程序雖然讀取數(shù)據(jù)時還是要以小結(jié):這一程序雖然讀取數(shù)據(jù)時還是要以單字符或字符數(shù)組單字符或字符數(shù)組方式,方式,但但寫入時可直接操作字符串寫入時可直接操作字符串,已有不小進步。當然,文本操作,已有不小進步。當然,文本操作通常是以通常是以“行行”為單位的,字符流中是否考慮到這些方面?為單位的,字符流中是否考慮到這些方面?繼承關(guān)系如下:繼承關(guān)系如下:(4) 緩沖字符流緩沖字符流(BufferedReader和和BufferedWriter類類)緩沖字符流由于使用了緩沖區(qū),提高了文本的讀寫速度。緩沖緩沖字符流由于使用了緩沖區(qū),提高了文本的讀寫速度。緩
18、沖區(qū)的大小可以由用戶設(shè)置,也可以是系統(tǒng)默認大小。區(qū)的大小可以由用戶設(shè)置,也可以是系統(tǒng)默認大小。n 構(gòu)造方法構(gòu)造方法1) BufferedReader(Reader in):使用系統(tǒng)默認的緩沖區(qū)大小生成使用系統(tǒng)默認的緩沖區(qū)大小生成字符輸入流字符輸入流2) BufferedReader(Reader in, int sz):使用用戶指定的緩沖區(qū)大使用用戶指定的緩沖區(qū)大小生成字符輸入流小生成字符輸入流3) BufferedWriter(Writer out):使用系統(tǒng)默認的緩沖區(qū)大小生成使用系統(tǒng)默認的緩沖區(qū)大小生成字符輸出流字符輸出流4) BufferedWriter(Writer out, int
19、 sz):使用用戶指定的緩沖區(qū)大使用用戶指定的緩沖區(qū)大小生成字符輸出流小生成字符輸出流不同操作系統(tǒng)的換行字符不盡相同,例如:不同操作系統(tǒng)的換行字符不盡相同,例如:Windows系統(tǒng)系統(tǒng)是是“rn” (即回車換行符即回車換行符),Linux系統(tǒng)是系統(tǒng)是”n”(即換行符即換行符)。上述兩個類分別提供了字符讀寫的便利方法:上述兩個類分別提供了字符讀寫的便利方法:n 常用方法:常用方法:1)緩沖字符輸入流類提供了一個緩沖字符輸入流類提供了一個“整行字符讀取整行字符讀取”方法:方法:格式:格式: String readLine() 功能:能夠整行地讀取字符,不同操作系統(tǒng)的換行符不同。功能:能夠整行地讀取
20、字符,不同操作系統(tǒng)的換行符不同。無無數(shù)據(jù)可讀時,返回數(shù)據(jù)可讀時,返回null,可以此來判斷數(shù)據(jù)是否讀取完畢,可以此來判斷數(shù)據(jù)是否讀取完畢2)緩沖字符輸出流提供了一個緩沖字符輸出流提供了一個“換行符換行符”方法:方法:格式:格式:void newLine() 功能:能夠根據(jù)不同的操作系統(tǒng),提供相應功能:能夠根據(jù)不同的操作系統(tǒng),提供相應“換行符換行符”n 應用舉例應用舉例例2:逐層包裝逐層包裝 字節(jié)流字節(jié)流字符流字符流緩沖流緩沖流/例例2 主要代碼:主要代碼:/ 文件字節(jié)輸出流文件字節(jié)輸出流-字符輸出流字符輸出流-緩沖輸出流緩沖輸出流FileOutputStream fos = new FileO
21、utputStream(char.txt);OutputStreamWriter osw = new OutputStreamWriter(fos);BufferedWriter bw = new BufferedWriter(osw);bw.write(您好您好!);/ 寫入字符串,下同寫入字符串,下同bw.newLine();/ 插入插入“換行符換行符”,下同,下同bw.write(謝謝謝謝!);bw.newLine();bw.write(再見再見!);bw.newLine();bw.close();/ 文件字節(jié)輸入流文件字節(jié)輸入流-字符輸入流字符輸入流-緩沖字符輸入流緩沖字符輸入流Fil
22、eInputStream fis = new FileInputStream(char.txt);InputStreamReader isr = new InputStreamReader(fis);BufferedReader br = new BufferedReader(isr);String s;/ 用循環(huán)逐行讀取字符串,直至遇到用循環(huán)逐行讀取字符串,直至遇到null為止為止while (s = br.readLine() != null)System.out.println(s);br.close();程序運行結(jié)果:程序運行結(jié)果:您好您好! !謝謝謝謝! !再見再見! !小結(jié):小結(jié):
23、l 這一程序這一程序能夠以能夠以“行行”為單位直接讀取、寫入字符串,操作為單位直接讀取、寫入字符串,操作比較方便;比較方便;l 但是,從但是,從 “文件字節(jié)流文件字節(jié)流”“字符流字符流”“緩沖流緩沖流” 要創(chuàng)要創(chuàng)建三種不同的對象,有些麻煩,能否簡化呢?建三種不同的對象,有些麻煩,能否簡化呢?繼承關(guān)系如下:繼承關(guān)系如下:(5) 文件字符流文件字符流(FileReader和和FileWriter類類)這兩個類是這兩個類是InputStreamReader或或OutStreamWriter的子類,的子類,具備從字節(jié)流到字符流轉(zhuǎn)換的功能。即:具備從字節(jié)流到字符流轉(zhuǎn)換的功能。即:FileOutputSt
24、ream fos = new FileOutputStream(char.txt);OutputStreamWriter osw = new OutputStreamWriter(fos); 等價于等價于FileWriter fw = new FileWriter(char.txt);FileInputStream fis = new FileInputStream(char.txt);InputStreamReader isr = new InputStreamReader(fis);等價于等價于FileReader fr = new FileReader(char.txt);n FileR
25、eader、FileWriter類的構(gòu)造方法類的構(gòu)造方法:1) FileReader(File file):使用使用File類型為參數(shù),創(chuàng)建一個類型為參數(shù),創(chuàng)建一個FileReader對象。字符集、緩沖區(qū)大小使用系統(tǒng)默認設(shè)置,下對象。字符集、緩沖區(qū)大小使用系統(tǒng)默認設(shè)置,下同。同。2) FileReader(String fileName):使用:使用String類型為參數(shù),創(chuàng)建一類型為參數(shù),創(chuàng)建一個個FileReader對象。對象。3) FileWriter(File file):使用:使用File類型為參數(shù),創(chuàng)建一個類型為參數(shù),創(chuàng)建一個FileWriter對象。對象。4) FileWrite
26、r(File file, boolean append):使用:使用File類型為參數(shù),類型為參數(shù),創(chuàng)建一個創(chuàng)建一個FileWriter對象。第二個參數(shù)為對象。第二個參數(shù)為true將把新增內(nèi)容追加將把新增內(nèi)容追加到文件尾部。到文件尾部。5) FileWriter(String fileName):使用:使用String類型為參數(shù),創(chuàng)建一類型為參數(shù),創(chuàng)建一個個FileWriter對象。對象。6) FileWriter(String fileName, boolean append):使用:使用String類類型為參數(shù),創(chuàng)建一個型為參數(shù),創(chuàng)建一個FileWriter對象。第二個參數(shù)為對象。第二個參
27、數(shù)為true將把新將把新增內(nèi)容追加到文件尾部。增內(nèi)容追加到文件尾部。n 例例3 FileWriter的應用的應用 主要代碼主要代碼FileWriter fw = new FileWriter(myfile.txt);BufferedWriter bw = new BufferedWriter(fw);bw.write(C+程序設(shè)計程序設(shè)計);bw.newLine();bw.write(Java程序設(shè)計程序設(shè)計!);bw.newLine();bw.close();System.out.println(文件內(nèi)容寫入完畢文件內(nèi)容寫入完畢);問題:這一程序用到了哪些類?調(diào)用了什么方法?實現(xiàn)了問題:這一
28、程序用到了哪些類?調(diào)用了什么方法?實現(xiàn)了的功能是什么?的功能是什么?myfile.txt內(nèi)容:內(nèi)容:C+程序設(shè)計程序設(shè)計Java程序設(shè)計程序設(shè)計n 例例4 FileReader的應用的應用 主要代碼主要代碼FileReader fr = new FileReader(myfile.txt);BufferedReader br = new BufferedReader(fr);String s;/ 用循環(huán)逐行讀取字符串,直至遇到用循環(huán)逐行讀取字符串,直至遇到null為止為止while (s = br.readLine() != null)System.out.println(s);br.clos
29、e();問題:程序用什么為條件來判斷字符串讀取完畢?問題:程序用什么為條件來判斷字符串讀取完畢?程序運行結(jié)果:程序運行結(jié)果:C+C+程序設(shè)計程序設(shè)計JavaJava程序設(shè)計程序設(shè)計n 例例5 從鍵盤中獲取數(shù)據(jù)從鍵盤中獲取數(shù)據(jù),存入文件存入文件(字節(jié)流字節(jié)流-字符流字符流-緩沖流緩沖流)/讀取讀取:鍵盤是字節(jié)輸入流鍵盤是字節(jié)輸入流,先轉(zhuǎn)換成字符輸入流先轉(zhuǎn)換成字符輸入流,再包裝成緩沖字符輸入流再包裝成緩沖字符輸入流InputStreamReader isr = new InputStreamReader(System.in);BufferedReader br = new BufferedRead
30、er(isr);/寫入寫入:先得到文件字符輸出流先得到文件字符輸出流,再包裝成緩沖字符輸出流再包裝成緩沖字符輸出流FileWriter fw = new FileWriter(myfile2.txt);BufferedWriter bw = new BufferedWriter(fw);System.out.println(請輸入字符串請輸入字符串(按按Ctrl+Z結(jié)束結(jié)束):);String data;/逐行讀取、寫入逐行讀取、寫入while (data = br.readLine() != null) bw.write(data);bw.newLine();br.close();bw.cl
31、ose();System.out.println(文件創(chuàng)建完畢文件創(chuàng)建完畢!);程序運行結(jié)果:程序運行結(jié)果:請輸入字符串請輸入字符串(按按Ctrl+Z結(jié)束結(jié)束):HelloHow are you?文件創(chuàng)建完畢文件創(chuàng)建完畢!(6) PrintWritern 該類是該類是Writer一個子類,繼承關(guān)系如下:一個子類,繼承關(guān)系如下:nPrintWriter也可以格式化文本輸出,該類實現(xiàn)了也可以格式化文本輸出,該類實現(xiàn)了PrintStream的所有的所有print()和和println()方法,但不能輸出字方法,但不能輸出字節(jié)。從節(jié)。從JDK 5.0起,起,PrintWriter類的功能得到了顯著增強
32、:類的功能得到了顯著增強:1)可使用可使用String和和File對象來構(gòu)造對象來構(gòu)造PrintWrtier對象,可取代對象,可取代FileWriter或或BufferedWriter類類。構(gòu)造方法有:。構(gòu)造方法有:PrintWriter(File file):使用:使用File類型參數(shù)創(chuàng)建不具有自動行類型參數(shù)創(chuàng)建不具有自動行刷新的對象。刷新的對象。 PrintWriter(File file, String csn):使用:使用File類型參數(shù)、指定類型參數(shù)、指定字符集創(chuàng)建不具有自動行刷新的對象。字符集創(chuàng)建不具有自動行刷新的對象。PrintWriter(OutputStream out):以
33、字節(jié)輸出流為參數(shù)創(chuàng)建不帶自動行:以字節(jié)輸出流為參數(shù)創(chuàng)建不帶自動行刷新的對象。刷新的對象。 PrintWriter(OutputStream out, boolean autoFlush):以字節(jié)輸出流:以字節(jié)輸出流為參數(shù)創(chuàng)建對象,由第二個參數(shù)決定是否具備自動行刷新功能。為參數(shù)創(chuàng)建對象,由第二個參數(shù)決定是否具備自動行刷新功能。 PrintWriter(String fileName):使用:使用String類型參數(shù)創(chuàng)建不具有自動行類型參數(shù)創(chuàng)建不具有自動行刷新的對象。刷新的對象。PrintWriter(String fileName, String csn):使用:使用String類型參數(shù)、指定類
34、型參數(shù)、指定字符集創(chuàng)建不具有自動行刷新的對象。字符集創(chuàng)建不具有自動行刷新的對象。 PrintWriter(Writer out):使用:使用Writer類型參數(shù)創(chuàng)建不具有自動行刷新的類型參數(shù)創(chuàng)建不具有自動行刷新的對象。對象。 PrintWriter(Writer out, boolean autoFlush):使用:使用Writer類型為參數(shù)類型為參數(shù)創(chuàng)建對象,由第二個參數(shù)決定是否具備自動行刷新功能。創(chuàng)建對象,由第二個參數(shù)決定是否具備自動行刷新功能。2) PrintWirter增加了一些新方法。例如:增加了一些新方法。例如:format(String format, Object. args)
35、實現(xiàn)類似于實現(xiàn)類似于C語言的格式輸出,第一個語言的格式輸出,第一個參數(shù)是帶格式控制符的字符串,后續(xù)參數(shù)是輸出對象或表達式參數(shù)是帶格式控制符的字符串,后續(xù)參數(shù)是輸出對象或表達式列表。列表。例如:例如:int a=5,b=10; (設(shè)設(shè)pw為為PrintWriter對象對象) pw.format(“%1$d+%2$d=%3$d”,a,b,a+b); 能輸出:能輸出:5+10=15結(jié)果,其中:結(jié)果,其中:n$(n為正整數(shù)為正整數(shù))是格式符,是格式符,1$、2$、3$分別代表第一、二、三項輸出內(nèi)容,分別代表第一、二、三項輸出內(nèi)容,d表示整數(shù),其它表示整數(shù),其它內(nèi)容請參考內(nèi)容請參考java.util.F
36、ormatter類的格式說明。類的格式說明。請注意:請注意:1)這個類的方法不拋出這個類的方法不拋出IOException異常,需要調(diào)用異常,需要調(diào)用checkError()來檢查是否出錯;來檢查是否出錯;2)PrintWriter與與BufferedWriter都帶有緩沖區(qū),它們的差別是:都帶有緩沖區(qū),它們的差別是:BufferedWriter通常在緩沖區(qū)滿了時才進行物理寫操作;通常在緩沖區(qū)滿了時才進行物理寫操作;PrintWriter的緩沖功能可以由用戶設(shè)置,通常也是在緩沖區(qū)的緩沖功能可以由用戶設(shè)置,通常也是在緩沖區(qū)滿了時才進行寫操作,當設(shè)置了自動行刷新功能后,調(diào)用滿了時才進行寫操作,當設(shè)
37、置了自動行刷新功能后,調(diào)用println()也會進行物理寫操作。也會進行物理寫操作。例例6 PrintWriter的應用的應用(主要代碼主要代碼)/ 利用文件輸出流創(chuàng)建利用文件輸出流創(chuàng)建PrintWriter對象對象PrintWriter pw = new PrintWriter(output.txt);/ 寫入幾個數(shù)據(jù)寫入幾個數(shù)據(jù)pw.println(hello);pw.println(18.97);pw.println(true);/ 格式化輸出數(shù)據(jù)格式化輸出數(shù)據(jù)pw.format(PI的近似值為的近似值為%1$10.6f, Math.PI);pw.println();pw.format(
38、e 的近似值為的近似值為%1$10.6f, Math.E);pw.println();int a = 5, b = 10;pw.format(%1$d+%2$d=%3$d, a, b, a + b);pw.close();System.out.println(數(shù)據(jù)寫入完畢數(shù)據(jù)寫入完畢!);問題:請解釋上述代碼功能問題:請解釋上述代碼功能程序運行結(jié)果:程序運行結(jié)果:hello18.97truePI的近似值為的近似值為 3.141593e 的近似值為的近似值為 2.7182825+10=152. 對象序列化對象序列化n 程序運行時,對象是存在于內(nèi)存中,程序結(jié)束后,對象將消程序運行時,對象是存在于內(nèi)
39、存中,程序結(jié)束后,對象將消失。有時,失。有時,需要將對象的某一狀態(tài)保存在文件或網(wǎng)絡(luò)中需要將對象的某一狀態(tài)保存在文件或網(wǎng)絡(luò)中(例例如:遠程方法調(diào)用如:遠程方法調(diào)用RMI) 。如何解決這一問題呢?。如何解決這一問題呢?n 當對象的屬性為基本數(shù)據(jù)類型或字符串時,雖然可以用當對象的屬性為基本數(shù)據(jù)類型或字符串時,雖然可以用“數(shù)數(shù)據(jù)流據(jù)流”保存到文件中,但屬性個數(shù)較多或?qū)ο髷?shù)目較大時,保存到文件中,但屬性個數(shù)較多或?qū)ο髷?shù)目較大時,要做到要做到“讀寫讀寫”順序、類型一致,非常困難;順序、類型一致,非常困難;n 若對象屬性為對象類型時,保存對象引用的值、毫無意義。若對象屬性為對象類型時,保存對象引用的值、毫無
40、意義。 由此可見,將對象由此可見,將對象“化整為零化整為零”的方法并不好用。可采用對的方法并不好用??刹捎脤ο笙蟆罢嬲≌嬲 钡姆椒ǖ姆椒ā皩ο笮蛄谢瘜ο笮蛄谢?1) 什么是對象的序列化什么是對象的序列化l 對象序列化對象序列化:把對象:把對象“整體整體”存放到文件或網(wǎng)絡(luò)上存放到文件或網(wǎng)絡(luò)上l 對象反序列化對象反序列化:從文件或網(wǎng)絡(luò):從文件或網(wǎng)絡(luò)“整體整體”讀取對象讀取對象對象要具備序列化的功能,必須對象要具備序列化的功能,必須實現(xiàn)實現(xiàn)java.io.Serializable接口接口象序列化象序列化/ /反序列化示圖反序列化示圖 說明:說明:l Serializable接口是一個空接口
41、,不包含任何方法接口是一個空接口,不包含任何方法,又稱標記,又稱標記接口,接口,String、Date等實現(xiàn)了此接口;等實現(xiàn)了此接口;l 進行序列化時進行序列化時保存的是對象屬性保存的是對象屬性,其方法以代碼方式出現(xiàn),其方法以代碼方式出現(xiàn),沒有必要保存。沒有必要保存。(2) ObjectInputStream和和ObjectOutputStreamn 這兩個類分別繼承了這兩個類分別繼承了InputStream、OutputStream類,并實類,并實現(xiàn)了現(xiàn)了ObjectInput、ObjectOutput接口接口;n 功能:功能:ObjectOutputStream是以字節(jié)流形式寫入對象,是以
42、字節(jié)流形式寫入對象,ObjectInputStream是以字節(jié)流形式讀取對象是以字節(jié)流形式讀取對象n 構(gòu)造方法:構(gòu)造方法:l ObjectInputStream(InputStream in) l ObjectOutputStream(OutputStream out) n 常用方法:常用方法:l Object readObject() :從:從 ObjectInputStream 讀取對象,讀取對象,要進行類型轉(zhuǎn)換要進行類型轉(zhuǎn)換l void writeObject(Object obj) :將指定的對象寫入:將指定的對象寫入 ObjectOutputStream流中流中 /例例7 序列化、反
43、序列化的例子序列化、反序列化的例子 見見“部分例題程序代碼部分例題程序代碼.doc”說明:說明:假假若不想讓對象的某一個屬性序列化,就可以在該屬性若不想讓對象的某一個屬性序列化,就可以在該屬性前面加上前面加上transient(短暫的,瞬時的短暫的,瞬時的)修飾符?,F(xiàn)在,我們將修飾符?,F(xiàn)在,我們將transient加在加在Student類中的類中的int age;語句前面,再次運行語句前面,再次運行程序,輸出結(jié)果為:程序,輸出結(jié)果為:學號姓名年齡平均成績0712345601張小三 087.60712345602李阿四 090.30712345603王連五 077.2問題:請解釋上述代碼功能問題
44、:請解釋上述代碼功能n 前面介紹的輸入流、輸出流,都有前面介紹的輸入流、輸出流,都有明確的分工:輸出流只明確的分工:輸出流只能寫入數(shù)據(jù),不能提供數(shù)據(jù);輸入流只能讀取數(shù)據(jù),不能能寫入數(shù)據(jù),不能提供數(shù)據(jù);輸入流只能讀取數(shù)據(jù),不能保存數(shù)據(jù)。保存數(shù)據(jù)。若要讀寫文件,需分別建立輸入流、輸出流,若要讀寫文件,需分別建立輸入流、輸出流,操作起來不是很方便操作起來不是很方便n RandomAccessFile類具有將類具有將“輸入流輸入流”、“輸出流輸出流”合合二為一的功能,利用它打開文件時,既可以二為一的功能,利用它打開文件時,既可以“讀取讀取”也可也可以以“寫入寫入”,還可根據(jù)需要任意,還可根據(jù)需要任意“
45、移動移動”文件讀寫指針位文件讀寫指針位置,置,這就是文件的隨機存取。該類對象的文件指針如下圖這就是文件的隨機存取。該類對象的文件指針如下圖所示:所示:3. 文件隨機存取文件隨機存取(RandomAccessFile類類)(1) 什么是文件的隨機存取什么是文件的隨機存取該類不屬于輸入流、輸出流范疇,它是該類不屬于輸入流、輸出流范疇,它是Object 的直接子類,實的直接子類,實現(xiàn)了現(xiàn)了DataInput 和和DataOutput 接口,其繼承關(guān)系如圖所示:接口,其繼承關(guān)系如圖所示:(2) RandomAccessFile類類該類支持移動文件指針進行讀寫操作,每進行一次讀寫操作,該類支持移動文件指
46、針進行讀寫操作,每進行一次讀寫操作,指針將往后移,移動的長度就是讀寫過的字節(jié)數(shù)目。指針將往后移,移動的長度就是讀寫過的字節(jié)數(shù)目。n構(gòu)造方法:構(gòu)造方法:1)RandomAccessFile(File file, String mode):以以File類型指類型指定的文件來創(chuàng)建對象,定的文件來創(chuàng)建對象,第二個參數(shù)指明文件訪問模式,第二個參數(shù)指明文件訪問模式,“r”表示只讀,表示只讀,“rw”表示讀寫。請注意:無表示讀寫。請注意:無“w”只寫方式只寫方式。2)RandomAccessFile(String name, String mode):以以String類型指定的文件來創(chuàng)建對象,第二個參數(shù)含義
47、同類型指定的文件來創(chuàng)建對象,第二個參數(shù)含義同(1)。n常用方法:可分成幾類常用方法:可分成幾類1)讀取類讀取類:read()、read(byte b)、read(byte b, int off, int len)、readXxx()(如:如:readBoolean() 、readByte() 、readChar() 、readDouble()、readFloat() 、readInt() 、readLong() 、readShort()、readUTF()、readLine()等等),這些方法在前面已介紹過,不再一一復述;,這些方法在前面已介紹過,不再一一復述;2)寫入類寫入類:write()
48、、write(byte b)、write(byte b, int off, int len)、writeXxx()(如:如: writeBoolean(boolean v) 、writeByte(int v) 、writeBy tes(String s) 、writeChar(int v)、writeDouble(double v)、writeFloat(float v)、writeInt(int v)、writeLong(long v)、writeShort(int v)、writeUTF(String str)等等),如上所述,不再重復。,如上所述,不再重復。3)long length()
49、:獲取文件長度,單位為字節(jié);獲取文件長度,單位為字節(jié);4)void setLength(long newLength):設(shè)置文件長度;:設(shè)置文件長度;5)long getFilePointer():返回文件指針當前位置,單位為字節(jié);返回文件指針當前位置,單位為字節(jié);6)int skipBytes(int n):將文件指針向下移動將文件指針向下移動n個字節(jié);個字節(jié);7)void seek(long pos):將文件指針移動到距離文件頭將文件指針移動到距離文件頭pos字節(jié)的位置;字節(jié)的位置;8)void close():關(guān)閉文件,釋放相應系統(tǒng)資源。:關(guān)閉文件,釋放相應系統(tǒng)資源。/例例8 隨機存取文
50、件的例子隨機存取文件的例子 主要代碼:主要代碼:/根據(jù)指定的數(shù)據(jù)文件名創(chuàng)建具有根據(jù)指定的數(shù)據(jù)文件名創(chuàng)建具有讀寫讀寫功能的功能的RandomAccessFile對象對象RandomAccessFile raf = new RandomAccessFile(numbers.dat, rw);/ 將將0,1,.,9的平方寫入數(shù)據(jù)文件中的平方寫入數(shù)據(jù)文件中for (int i = 0; i 10; i+)raf.writeInt(i * i);/ 讀取數(shù)據(jù)文件中處于偶數(shù)位置的數(shù)據(jù)讀取數(shù)據(jù)文件中處于偶數(shù)位置的數(shù)據(jù)System.out.println(處于偶數(shù)位置的序列處于偶數(shù)位置的序列: );long
51、length = raf.length();/ 得到文件的總字節(jié)數(shù)得到文件的總字節(jié)數(shù)for (int i = 4; i length; i += 2 * 4) / 一個整數(shù)占一個整數(shù)占4字節(jié)字節(jié)raf.seek(i);/ 定位偶數(shù)位置數(shù)據(jù)的字節(jié)位置定位偶數(shù)位置數(shù)據(jù)的字節(jié)位置System.out.print(raf.readInt() + );raf.close();/ 關(guān)閉文件關(guān)閉文件 程序運行結(jié)果程序運行結(jié)果處于偶數(shù)位置的序列處于偶數(shù)位置的序列: : 1 9 25 49 81 1 9 25 49 81 文件可以是也可以不是文本格式文件可以是也可以不是文本格式4. Excel文檔的讀寫文檔的讀
52、寫(了解了解)在日常工作、學習、生活中,經(jīng)常會使用在日常工作、學習、生活中,經(jīng)常會使用Word、Excel、PDF文檔。很遺憾,現(xiàn)在的文檔。很遺憾,現(xiàn)在的JDK沒有提供操作這些文件的類沒有提供操作這些文件的類庫,好在有一些第三方的庫,好在有一些第三方的jar包可供我們選用。這里只介紹包可供我們選用。這里只介紹Excel文檔的讀寫,不作為考試要求。文檔的讀寫,不作為考試要求。 (1) Java Excel簡介簡介Java Excel(簡稱簡稱JExcel)是一個處理是一個處理excel文檔的工具,該文檔的工具,該組件比較小巧,適合于于小項目。組件比較小巧,適合于于小項目。JExcel也是開源項目
53、,利也是開源項目,利用它可方便讀取用它可方便讀取excel文件內(nèi)容,創(chuàng)建文件內(nèi)容,創(chuàng)建excel文檔、在指定位文檔、在指定位置寫入內(nèi)容。置寫入內(nèi)容。JExcel的下載網(wǎng)址是:的下載網(wǎng)址是:http:/ 包是包是jxl.jar。如何配置如何配置jxl.jar包?有多種方法包?有多種方法n 在在classpath中添加中添加jxl.jarn 在在Eclipse中,右擊中,右擊Java項目,通過菜單項目,通過菜單Build Path/Add External Archieves.來添加來添加jxl.jarJExcel API文檔的使用文檔的使用下載后解壓即可使用下載后解壓即可使用 (2) Excel
54、文檔內(nèi)容的讀取文檔內(nèi)容的讀取工作簿工作簿(workbook)工作表工作表(worksheet)單元格單元格(cell)先介紹與讀取操作相關(guān)的主要類、接口:先介紹與讀取操作相關(guān)的主要類、接口:1) jxl.Workbook類類:表示工作簿,包含多個工廠方法和存取工:表示工作簿,包含多個工廠方法和存取工作表作表(Sheet)的方法。常用方法有:的方法。常用方法有:要讀取要讀取Excel文檔的內(nèi)容,有必要了解其組成元素:文檔的內(nèi)容,有必要了解其組成元素: static WritableWorkbook createWorkbook(java.io.File file):靜:靜態(tài)工廠方法,以態(tài)工廠方法
55、,以File類型為參數(shù),類型為參數(shù),產(chǎn)成可寫入的工作簿產(chǎn)成可寫入的工作簿(WritableWorkbook)對象對象,用于,用于excel文檔的寫入,稍后介紹文檔的寫入,稍后介紹 Sheet getSheet(int index):通過下標來得到工作表通過下標來得到工作表(Sheet)對象,對象,第第1個工作表下標為個工作表下標為0,以此類推,以此類推 Sheet getSheets():得到所有的工作表,以數(shù)組方式返回得到所有的工作表,以數(shù)組方式返回 static Workbook getWorkbook(java.io.File file):靜態(tài)工廠方法,靜態(tài)工廠方法,以以File類型為參
56、數(shù),類型為參數(shù),得到工作簿得到工作簿(Workbook)對象對象,用于用于excel文檔的文檔的讀取讀取 void close():關(guān)閉工作簿關(guān)閉工作簿2) jxl.Sheet接口接口:表示一個工作表對象表示一個工作表對象,可處理單個或一組單元格。常用方,可處理單個或一組單元格。常用方法有:法有: Cell getCell(int column, int row):得到指定列、行的單元格得到指定列、行的單元格注意:注意:列在先,行在后列在先,行在后 Cell getColumn(int col):得到指定列的單元格,返回類型為數(shù)組得到指定列的單元格,返回類型為數(shù)組 Cell getRow(in
57、t row):得到指定行的單元格,返回類型為數(shù)組得到指定行的單元格,返回類型為數(shù)組 int getColumns():得到總列數(shù)得到總列數(shù) int getRows():得到總行數(shù)得到總行數(shù) String getName():得到工作表名字得到工作表名字3) jxl.Cell接口:表示一個單元格接口:表示一個單元格,能,能查詢其類型和內(nèi)容查詢其類型和內(nèi)容。常用方法有:。常用方法有: int getColumn():得到其列下標,第得到其列下標,第1列為列為0,以此類推,以此類推 int getRow():得到其行下標,第得到其行下標,第1行為行為0,以此類推,以此類推 String getCon
58、tents():以字符串方式返回以字符串方式返回單元格內(nèi)容單元格內(nèi)容 CellType getType():得到單元格得到單元格數(shù)據(jù)類型數(shù)據(jù)類型。CellType類的常量規(guī)定類的常量規(guī)定一些單元格類型,如:一些單元格類型,如:NUMBER、DATE、BOOLEAN、LABEL、EMPTY、ERROR等等例例9 讀取讀取Excel文檔內(nèi)容。代碼見文檔內(nèi)容。代碼見word文檔文檔 (3) Excel文檔內(nèi)容的寫入文檔內(nèi)容的寫入1) jxl.write.WritableWorkbook類:表示可寫入的工作簿。常用方法有:類:表示可寫入的工作簿。常用方法有:WritableSheet createSh
59、eet(java.lang.String name, int index):生成:生成WritableSheet對象,第一個參數(shù)指定工作表名字,第二個參數(shù)工作表下標對象,第一個參數(shù)指定工作表名字,第二個參數(shù)工作表下標WritableSheet getSheet(int index):通過下標來得到:通過下標來得到WritableSheetWritableSheet getSheet(java.lang.String name):通過名字來得到:通過名字來得到WritableSheet若要向若要向excel文檔寫入數(shù)據(jù),不能直接使用前面介紹的文檔寫入數(shù)據(jù),不能直接使用前面介紹的Workbook、
60、Sheet、Cell,而,而應使用應使用jxl.write包中的包中的WritableWorkbook、WritableSheet、WritableCell類或接口類或接口,單元格添加的數(shù)據(jù)除了單元格添加的數(shù)據(jù)除了String類型類型外,還可以是外,還可以是DateTime、Number等,并設(shè)置相應格式。下面介紹相關(guān)的類和接口。等,并設(shè)置相應格式。下面介紹相關(guān)的類和接口。 void removeSheet(int index):刪除指定的工作表刪除指定的工作表 void write():以指定格式將工作簿數(shù)據(jù)寫出以指定格式將工作簿數(shù)據(jù)寫出 void close():關(guān)閉工作簿關(guān)閉工作簿2)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 租賃建筑設(shè)備合同
- 交通運輸行業(yè)聘用合同模板
- 鐵路局乘務(wù)員招聘協(xié)議
- 空調(diào)維修班組施工合同
- 建筑通風工程合同執(zhí)行細則
- 安防工程施工合同備案說明
- 城市應急安防監(jiān)控系統(tǒng)施工合同
- 債權(quán)轉(zhuǎn)讓中介協(xié)議
- 企業(yè)供應商合同管理策略
- 火車站消防系統(tǒng)升級協(xié)議
- 2025年競聘醫(yī)院內(nèi)科醫(yī)生崗位演講稿模版(3篇)
- 虛擬貨幣地址分析技術(shù)的研究-洞察分析
- 綠色供應鏈管理制度內(nèi)容
- 無錫市區(qū)2024-2025學年四年級上學期數(shù)學期末試題一(有答案)
- 2024年河南省公務(wù)員考試《行測》真題及答案解析
- 柳宗元毛筆楷書字帖
- 纖力玻璃鋼管道厚度,重量一覽表
- 新浪網(wǎng)刪貼申請文檔 (個人)
- 低溫乙烯罐內(nèi)罐預冷過程溫度急降原因探討
- 大同利創(chuàng)光伏電站試運行報告
- 機動車維修竣工出廠合格證
評論
0/150
提交評論