




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、.第第11/輸出輸出本章要點(diǎn)本章要點(diǎn)u 了解了解Java中流的概念中流的概念u 了解了解Java中輸入輸出流的分類中輸入輸出流的分類u 掌握文件輸入輸出流的使用方法掌握文件輸入輸出流的使用方法u 掌握帶緩存的輸入輸出流的使用掌握帶緩存的輸入輸出流的使用u 了解了解ZIP壓縮輸入輸出流的應(yīng)用壓縮輸入輸出流的應(yīng)用.第第11章章 輸入輸入/輸出輸出主要內(nèi)容主要內(nèi)容.11.1 輸入輸入/輸出流輸出流n通常程序需要通常程序需要從外部獲取從外部獲取/輸出信息輸出信息這個(gè)這個(gè)“外部外部”范圍很廣,包括諸如范圍很廣,包括諸如鍵盤、顯鍵盤、顯示器、文件示器、文件、磁盤、網(wǎng)絡(luò)、另外一個(gè)程序等、磁盤、網(wǎng)絡(luò)、另外一個(gè)
2、程序等“信息信息”也可以是任何類型的,例如一個(gè)對也可以是任何類型的,例如一個(gè)對象、字符串、圖像、聲音等象、字符串、圖像、聲音等n通過使用通過使用java.io包包中的中的輸入輸入/輸出流類輸出流類就可以就可以達(dá)到輸入輸出信息的目的達(dá)到輸入輸出信息的目的.nJava所有的所有的I/O機(jī)制都是基于機(jī)制都是基于數(shù)據(jù)流數(shù)據(jù)流進(jìn)行輸進(jìn)行輸入輸出,這些數(shù)據(jù)流表示了入輸出,這些數(shù)據(jù)流表示了字符或者字節(jié)數(shù)字符或者字節(jié)數(shù)據(jù)據(jù)的流動(dòng)序列。的流動(dòng)序列。nJava的的I/O流流提供了讀寫數(shù)據(jù)的標(biāo)準(zhǔn)方法提供了讀寫數(shù)據(jù)的標(biāo)準(zhǔn)方法n任何任何Java中表示數(shù)據(jù)源的對象都會(huì)提供以中表示數(shù)據(jù)源的對象都會(huì)提供以數(shù)數(shù)據(jù)流的方式據(jù)流的
3、方式讀寫它的數(shù)據(jù)的方法。讀寫它的數(shù)據(jù)的方法。nJava.io是大多數(shù)面向數(shù)據(jù)流的輸入是大多數(shù)面向數(shù)據(jù)流的輸入/輸出類輸出類的主要軟件包。的主要軟件包。11.1 輸入輸入/輸出流輸出流.n數(shù)據(jù)流數(shù)據(jù)流是一串連續(xù)不斷的數(shù)據(jù)的集合。是一串連續(xù)不斷的數(shù)據(jù)的集合。n數(shù)據(jù)寫入程序數(shù)據(jù)寫入程序可以是一段、一段地向數(shù)據(jù)流可以是一段、一段地向數(shù)據(jù)流管道中寫入數(shù)據(jù),這些數(shù)據(jù)段會(huì)按先后順序管道中寫入數(shù)據(jù),這些數(shù)據(jù)段會(huì)按先后順序形成一個(gè)長的數(shù)據(jù)流。形成一個(gè)長的數(shù)據(jù)流。n對數(shù)據(jù)讀取程序來說,看不到數(shù)據(jù)流在寫入對數(shù)據(jù)讀取程序來說,看不到數(shù)據(jù)流在寫入時(shí)的分段情況,每次可以讀取其中的任意長時(shí)的分段情況,每次可以讀取其中的任意
4、長度的數(shù)據(jù),但度的數(shù)據(jù),但只能先讀取前面的數(shù)據(jù)后,再只能先讀取前面的數(shù)據(jù)后,再讀取后面的數(shù)據(jù)讀取后面的數(shù)據(jù)。11.1 輸入輸入/輸出流輸出流.n一組有序,有起點(diǎn)和終點(diǎn)的字節(jié)的數(shù)據(jù)序列。一組有序,有起點(diǎn)和終點(diǎn)的字節(jié)的數(shù)據(jù)序列。n包括輸入流和輸出流。包括輸入流和輸出流。11.1 輸入輸入/輸出流輸出流.11.1.1 I/O流的概念流的概念 在在Java中將信息的輸入輸出過程抽象為中將信息的輸入輸出過程抽象為I/O流流n輸入是指數(shù)據(jù)流入程序輸入是指數(shù)據(jù)流入程序n輸出是指數(shù)據(jù)從程序流出輸出是指數(shù)據(jù)從程序流出一個(gè)流就是一個(gè)從源流向目的地的數(shù)據(jù)序列一個(gè)流就是一個(gè)從源流向目的地的數(shù)據(jù)序列IO流類一旦被創(chuàng)建就
5、會(huì)自動(dòng)打開流類一旦被創(chuàng)建就會(huì)自動(dòng)打開通過調(diào)用通過調(diào)用close方法方法,可以顯式關(guān)閉任何一個(gè),可以顯式關(guān)閉任何一個(gè)流,如果流對象不再被引用,流,如果流對象不再被引用,Java的垃圾回的垃圾回收機(jī)制也會(huì)隱式地關(guān)閉它收機(jī)制也會(huì)隱式地關(guān)閉它.11.1.1 I/O流的概念流的概念n輸入流輸入流為了從信息源獲取信息,程序打開一個(gè)輸為了從信息源獲取信息,程序打開一個(gè)輸入流,程序可從輸入流讀取信息入流,程序可從輸入流讀取信息.11.1.1 I/O流的概念流的概念n輸出流輸出流當(dāng)程序需要向目標(biāo)位置寫信息時(shí),便需要當(dāng)程序需要向目標(biāo)位置寫信息時(shí),便需要打開一個(gè)輸出流,程序通過輸出流向這個(gè)打開一個(gè)輸出流,程序通過輸
6、出流向這個(gè)目標(biāo)位置寫信息目標(biāo)位置寫信息9.對象對象源源? /目標(biāo)目標(biāo)? 或兩者或兩者?disk file running program monitor keyboard Internet connection image scanner mouse BothBothDestinationSourceBothSourceSource11.1.1 I/O流的概念流的概念n源和目標(biāo)的類型源和目標(biāo)的類型.n讀寫數(shù)據(jù)的方法讀寫數(shù)據(jù)的方法不論數(shù)據(jù)從哪來,到哪去,也不論數(shù)據(jù)不論數(shù)據(jù)從哪來,到哪去,也不論數(shù)據(jù)本身是何類型,讀寫數(shù)據(jù)的方法大體上本身是何類型,讀寫數(shù)據(jù)的方法大體上都是一樣的都是一樣的讀讀寫寫打開
7、一個(gè)流打開一個(gè)流讀信息讀信息關(guān)閉流關(guān)閉流打開一個(gè)流打開一個(gè)流寫信息寫信息關(guān)閉流關(guān)閉流11.1.1 I/O流的概念流的概念.11.1.1 I/O流的概念流的概念n緩沖流緩沖流:為流配備一個(gè)緩沖區(qū):為流配備一個(gè)緩沖區(qū)(buffer)緩沖區(qū)緩沖區(qū)就是一塊存儲(chǔ)區(qū)域,用來輔助與外部就是一塊存儲(chǔ)區(qū)域,用來輔助與外部設(shè)備的數(shù)據(jù)傳輸,從而提高數(shù)據(jù)的傳輸效率設(shè)備的數(shù)據(jù)傳輸,從而提高數(shù)據(jù)的傳輸效率在實(shí)現(xiàn)在實(shí)現(xiàn)寫數(shù)據(jù)寫數(shù)據(jù)時(shí),先將這些數(shù)據(jù)時(shí),先將這些數(shù)據(jù)寫入流緩沖寫入流緩沖區(qū)區(qū),而并不直接將它們送入輸出設(shè)備,流緩,而并不直接將它們送入輸出設(shè)備,流緩沖區(qū)的數(shù)據(jù)量會(huì)被自動(dòng)地跟蹤,一旦發(fā)現(xiàn)沖區(qū)的數(shù)據(jù)量會(huì)被自動(dòng)地跟蹤,一旦
8、發(fā)現(xiàn)緩緩沖區(qū)滿了沖區(qū)滿了,就會(huì)將其中的數(shù)據(jù),就會(huì)將其中的數(shù)據(jù)一次性傳輸一次性傳輸?shù)降酵獠吭O(shè)備上,緩沖區(qū)變?yōu)榭胀獠吭O(shè)備上,緩沖區(qū)變?yōu)榭湛梢詼p少與外部設(shè)備打交道的次數(shù)可以減少與外部設(shè)備打交道的次數(shù).11.1.2 預(yù)定義的預(yù)定義的I/O流類概述流類概述n從流的方向劃分從流的方向劃分輸入流輸入流輸出流輸出流n從流的分工劃分從流的分工劃分節(jié)點(diǎn)流節(jié)點(diǎn)流處理流處理流n從流的內(nèi)容劃分從流的內(nèi)容劃分面向字符的流面向字符的流(字符流字符流)面向字節(jié)的流面向字節(jié)的流(二進(jìn)制流二進(jìn)制流).11.1.2 預(yù)定義的預(yù)定義的I/O流類概述流類概述njava.io包包的頂級層次結(jié)構(gòu)的頂級層次結(jié)構(gòu)面向字符的流:專門用于字符數(shù)據(jù)
9、面向字符的流:專門用于字符數(shù)據(jù)面向字節(jié)的流:用于一般目的面向字節(jié)的流:用于一般目的.1) 面向字符的流面向字符的流n面向字符的流面向字符的流針對針對字符數(shù)據(jù)的特點(diǎn)字符數(shù)據(jù)的特點(diǎn)進(jìn)行過進(jìn)行過優(yōu)化優(yōu)化,提,提供一些面向字符的有用特性供一些面向字符的有用特性源或目標(biāo)通常是源或目標(biāo)通常是文本文件文本文件.n面向字符的抽象類面向字符的抽象類Reader和和Writerjava.io包中所有包中所有字符流字符流的的抽象基類抽象基類Reader提供了提供了輸入輸入字符的字符的APIWriter提供了提供了輸出輸出字符的字符的API多數(shù)程序使用這兩個(gè)抽象類的一系列子類多數(shù)程序使用這兩個(gè)抽象類的一系列子類來讀入
10、來讀入/寫出文本信息寫出文本信息1) 面向字符的流面向字符的流.陰影部分為節(jié)點(diǎn)流陰影部分為節(jié)點(diǎn)流1) 面向字符的流面向字符的流.n數(shù)據(jù)源或目標(biāo)中含有非字符數(shù)據(jù),必須用字?jǐn)?shù)據(jù)源或目標(biāo)中含有非字符數(shù)據(jù),必須用字節(jié)流來輸入節(jié)流來輸入/輸出輸出n通常被用來讀寫諸如圖片、聲音之類的二進(jìn)通常被用來讀寫諸如圖片、聲音之類的二進(jìn)制數(shù)據(jù)制數(shù)據(jù)n絕大多數(shù)數(shù)據(jù)是被存儲(chǔ)為二進(jìn)制文件的,絕大多數(shù)數(shù)據(jù)是被存儲(chǔ)為二進(jìn)制文件的,世世界上的文本文件大約只能占到界上的文本文件大約只能占到2,通常二,通常二進(jìn)制文件要比含有相同數(shù)據(jù)量的文本文件小進(jìn)制文件要比含有相同數(shù)據(jù)量的文本文件小得多得多2) 面向字節(jié)的流面向字節(jié)的流.nInpu
11、tStream和和OutputStream是用來處理是用來處理8位字節(jié)流位字節(jié)流的抽象基類,程序使的抽象基類,程序使用這兩個(gè)類的子類來讀寫用這兩個(gè)類的子類來讀寫8位的字節(jié)信息位的字節(jié)信息分為兩部分分為兩部分n節(jié)點(diǎn)流節(jié)點(diǎn)流n處理流處理流2) 面向字節(jié)的流面向字節(jié)的流.陰影部分為節(jié)點(diǎn)流陰影部分為節(jié)點(diǎn)流2) 面向字節(jié)的流面向字節(jié)的流.3) 標(biāo)準(zhǔn)輸入輸出標(biāo)準(zhǔn)輸入輸出n標(biāo)準(zhǔn)輸入輸出流對象,標(biāo)準(zhǔn)輸入輸出流對象,System類靜態(tài)成員變量類靜態(tài)成員變量System.in: InputStream類型的,代表標(biāo)類型的,代表標(biāo)準(zhǔn)輸入流,這個(gè)流是已經(jīng)打開了的,準(zhǔn)輸入流,這個(gè)流是已經(jīng)打開了的,默認(rèn)狀默認(rèn)狀態(tài)對應(yīng)于鍵
12、盤輸入。態(tài)對應(yīng)于鍵盤輸入。System.out:PrintStream類型的,代表標(biāo)類型的,代表標(biāo)準(zhǔn)輸出流,準(zhǔn)輸出流,默認(rèn)狀態(tài)對應(yīng)于屏幕輸出默認(rèn)狀態(tài)對應(yīng)于屏幕輸出System.err:PrintStream類型的,代表標(biāo)類型的,代表標(biāo)準(zhǔn)錯(cuò)誤信息輸出流,準(zhǔn)錯(cuò)誤信息輸出流,默認(rèn)狀態(tài)對應(yīng)屏幕輸出默認(rèn)狀態(tài)對應(yīng)屏幕輸出.public class Echo public static void main(String args) throws IOException BufferedReader in = new BufferedReader( new InputStreamReader(System.i
13、n); String s; while(s = in.readLine().length()!= 0) System.out.println(s); 運(yùn)行結(jié)果運(yùn)行結(jié)果Hello!Hello!.nSystem.in程序啟動(dòng)時(shí)由程序啟動(dòng)時(shí)由Java系統(tǒng)自動(dòng)創(chuàng)建的流對象系統(tǒng)自動(dòng)創(chuàng)建的流對象,它是原始的字節(jié)流,它是原始的字節(jié)流,不能直接從中讀取字符不能直接從中讀取字符,需要對其進(jìn)行進(jìn)一步的處理需要對其進(jìn)行進(jìn)一步的處理nInputStreamReader(System.in)以以System.in為參數(shù)創(chuàng)建一個(gè)為參數(shù)創(chuàng)建一個(gè)InputStreamReader流對象流對象,相當(dāng)于字節(jié)流和字符流之間的一座橋
14、,相當(dāng)于字節(jié)流和字符流之間的一座橋梁,讀取字節(jié)并將其轉(zhuǎn)換為字符梁,讀取字節(jié)并將其轉(zhuǎn)換為字符nBufferedReader in對對InputStreamReader處理后的信息進(jìn)行緩沖,處理后的信息進(jìn)行緩沖,以提高效率以提高效率.4) 處理流處理流n不直接與數(shù)據(jù)源或目標(biāo)相連,而是不直接與數(shù)據(jù)源或目標(biāo)相連,而是基于另一個(gè)基于另一個(gè)流來構(gòu)造流來構(gòu)造n從流讀寫數(shù)據(jù)的同時(shí)對數(shù)據(jù)進(jìn)行處理從流讀寫數(shù)據(jù)的同時(shí)對數(shù)據(jù)進(jìn)行處理n實(shí)例中的實(shí)例中的InputStreamReader和和BufferedReader都都屬于處理流屬于處理流InputStreamReader讀取字節(jié)并轉(zhuǎn)換為字符讀取字節(jié)并轉(zhuǎn)換為字符Buf
15、feredReader對另一個(gè)流產(chǎn)生的數(shù)據(jù)進(jìn)行對另一個(gè)流產(chǎn)生的數(shù)據(jù)進(jìn)行緩沖緩沖.用一行表達(dá)式實(shí)現(xiàn):用一行表達(dá)式實(shí)現(xiàn):BufferedReader stdin = new BufferedReader ( new InputStreamReader(System.in) ); 4) 處理流處理流.5) I/O異常異常n多數(shù)多數(shù)IO方法在遇到錯(cuò)誤時(shí)會(huì)拋出異常方法在遇到錯(cuò)誤時(shí)會(huì)拋出異常,因此調(diào),因此調(diào)用這些方法時(shí)必須用這些方法時(shí)必須在方法頭聲明拋出在方法頭聲明拋出IOException異常異?;蛘咴诨蛘咴趖ry塊中執(zhí)行塊中執(zhí)行IO,然后捕獲,然后捕獲IOException. 11.1.3 File
16、類類 n表示磁盤文件信息表示磁盤文件信息n定義了一些與平臺無關(guān)的方法來操縱文件定義了一些與平臺無關(guān)的方法來操縱文件創(chuàng)建、刪除文件創(chuàng)建、刪除文件重命名文件重命名文件判斷文件的讀寫權(quán)限及是否存在判斷文件的讀寫權(quán)限及是否存在設(shè)置和查詢文件的最近修改時(shí)間等設(shè)置和查詢文件的最近修改時(shí)間等n構(gòu)造文件流可以使用構(gòu)造文件流可以使用File類的對象作為參數(shù)類的對象作為參數(shù).public File(String name) 指定與 File 對象關(guān)聯(lián)的文件或目錄的名稱, name 可以包含路徑信息及文件或目錄名 public File(String pathToName, String name) 使用參數(shù) pa
17、thToName(絕對路徑或相對路徑)來定位參數(shù) name 所指定的文件或目錄 public File(File directory, String name) 使用現(xiàn)有的File對象directory(絕對路徑或相對路徑)來定位參數(shù) name 所指定的文件或目錄 public File(URI rui) 使用給定的統(tǒng)一資源定位符(uniform resource identifier,URI)來定位文件 11.1.3 File 類類 .boolean canRead() 如果文件可讀,則返回真,否則返回假 boolean canWrite() 如果文件可寫,則返回真,否則返回假 boolea
18、n exists() 如果File構(gòu)造函數(shù)參數(shù)所指定的名稱是指定路徑中的文件或目錄,則返回真,否則返回假 boolean createNewFile() 如果文件不存在,則創(chuàng)建這個(gè)名字的空文件,并返回真,如果文件存在,則返回假 boolean isFile() 如果 File 構(gòu)造函數(shù)參數(shù)所指定的名稱是一個(gè)文件,則返回真,否則返回假 boolean isDirectory() 如果 File 構(gòu)造函數(shù)參數(shù)所指定的名稱是一個(gè)目錄,則返回真,否則返回假 boolean isAbsolute() 如果File構(gòu)造函數(shù)參數(shù)所指定的名稱是一個(gè)文件或目錄的絕對路徑,則返回真,否則返回假 boolean d
19、elete() 刪除文件或目錄,如果是目錄,必須是空目錄才能刪除成功,刪除成功返回真,否則返回假 11.1.3 File 類類 .public static void main(String args) throws IOException new File(D:+ File.separator+Hello.txt); if (f.exists() f.delete(); else try f.createNewFile(); catch(Exception e) System.out.println(e.getMessage(); .n運(yùn)行結(jié)果運(yùn)行結(jié)果因?yàn)樵诶驗(yàn)樵诶?1_2中已經(jīng)創(chuàng)建了中已
20、經(jīng)創(chuàng)建了d:Hello.txt,所,所以第一次運(yùn)行將刪除這個(gè)文件以第一次運(yùn)行將刪除這個(gè)文件第二次運(yùn)行則又創(chuàng)建了一個(gè)此名的空文件第二次運(yùn)行則又創(chuàng)建了一個(gè)此名的空文件n分析分析在試圖打開文件之前,可以使用在試圖打開文件之前,可以使用File類的類的isFile方法來確定方法來確定File對象是否代表一個(gè)文件對象是否代表一個(gè)文件而非目錄)而非目錄)還可通過還可通過exists方法判斷同名文件或路徑是否方法判斷同名文件或路徑是否存在,進(jìn)而采取正確的方法,以免造成誤操作存在,進(jìn)而采取正確的方法,以免造成誤操作31 11.1.3 File 類類 .11.2 文件讀寫文件讀寫n11.2.1 寫文本文件寫文本
21、文件n11.2.2 讀文本文件讀文本文件n11.2.3 寫二進(jìn)制文件寫二進(jìn)制文件n11.2.4 讀二進(jìn)制文件讀二進(jìn)制文件n11.2.5 處理壓縮文件處理壓縮文件n11.2.6 對象序列化對象序列化.11.2.1 寫文本文件寫文本文件 n本節(jié)知識點(diǎn)本節(jié)知識點(diǎn)類類 創(chuàng)建一個(gè)磁盤文件創(chuàng)建一個(gè)磁盤文件 關(guān)閉一個(gè)磁盤文件關(guān)閉一個(gè)磁盤文件 write() 方法方法捕獲捕獲I/O異常異常 BufferedWriter 類類.1) 類類(字符輸出流類字符輸出流類)n構(gòu)造方法構(gòu)造方法 fw = new (String );創(chuàng)建字符輸出流類對象和已存在的文件相關(guān)聯(lián)。創(chuàng)建字符輸出流類對象和已存在的文件相關(guān)聯(lián)。文件不
22、存在,則創(chuàng)建。文件不存在,則創(chuàng)建。 fw = new (String , boolean append);創(chuàng)建字符輸出流類對象和已存在的文件相關(guān)聯(lián),創(chuàng)建字符輸出流類對象和已存在的文件相關(guān)聯(lián),并設(shè)置該該流對文件的操作是否為續(xù)寫并設(shè)置該該流對文件的操作是否為續(xù)寫 fw = new (C:demo.txt); fw = new (C:demo.txt,ture); .1) 類類(字符輸出流類字符輸出流類)n主要方法主要方法void write(String str) n寫入字符串。寫入字符串。viod flush() n刷新該流中的緩沖。刷新該流中的緩沖。viod close() n關(guān)閉此流。關(guān)閉此
23、流。.11.2.1 寫文本文件寫文本文件【例例】在在C盤根目錄創(chuàng)建文本文件盤根目錄創(chuàng)建文本文件Hello.txt,并往里寫入若干行文本并往里寫入若干行文本public static void main ( String args ) throws IOException String = D:Hello.txt; writer = new ( ); writer.write( Hello!n); writer.write( This is a filen); writer.close(); .n每次運(yùn)行這個(gè)程序,都將刪除已經(jīng)存在每次運(yùn)行這個(gè)程序,都將刪除已經(jīng)存在的的”Hello.txt”文件,
24、創(chuàng)建一個(gè)新的同名文件文件,創(chuàng)建一個(gè)新的同名文件n的構(gòu)造方法有五個(gè),本例是通過一個(gè)字符串的構(gòu)造方法有五個(gè),本例是通過一個(gè)字符串指定文件名來創(chuàng)建指定文件名來創(chuàng)建n類的類的write方法向文件中寫入字符方法向文件中寫入字符nclose方法清空流里的內(nèi)容并關(guān)閉它。方法清空流里的內(nèi)容并關(guān)閉它。如果如果不調(diào)用該方法,可能系統(tǒng)還沒有完成所有數(shù)不調(diào)用該方法,可能系統(tǒng)還沒有完成所有數(shù)據(jù)的寫操作,程序就結(jié)束了據(jù)的寫操作,程序就結(jié)束了11.2.1 寫文本文件寫文本文件-實(shí)例說明實(shí)例說明.nWriter類的流可實(shí)現(xiàn)內(nèi)部格式到外部磁盤文類的流可實(shí)現(xiàn)內(nèi)部格式到外部磁盤文件格式的轉(zhuǎn)換件格式的轉(zhuǎn)換“Hello.txt”是一個(gè)
25、普通的是一個(gè)普通的ASCII碼文本文件,碼文本文件,英文字符占一個(gè)字節(jié),中文字符占兩個(gè)字節(jié)英文字符占一個(gè)字節(jié),中文字符占兩個(gè)字節(jié)Java程序中的字符串則是每個(gè)字符占兩個(gè)字程序中的字符串則是每個(gè)字符占兩個(gè)字節(jié)的,采用節(jié)的,采用Unicode編碼編碼11.2.1 寫文本文件寫文本文件-實(shí)例說明實(shí)例說明.public static void main ( String args ) String = D:Hello.txt ; try /將所有IO操作放入try塊中 writer = new ( ,true ); writer.write( Hello!n); writer.write( This
26、is a text filen); writer.close(); catch ( IOException iox) System.out.println(Problem writing + ); .n運(yùn)行此程序,運(yùn)行此程序,會(huì)發(fā)現(xiàn)在原文件內(nèi)容后面又會(huì)發(fā)現(xiàn)在原文件內(nèi)容后面又追加了重復(fù)的內(nèi)容追加了重復(fù)的內(nèi)容,這就是將構(gòu)造方法的這就是將構(gòu)造方法的第二個(gè)參數(shù)設(shè)為第二個(gè)參數(shù)設(shè)為true的效果的效果n如果將文件屬性改為只讀屬性,再運(yùn)行本如果將文件屬性改為只讀屬性,再運(yùn)行本程序,就會(huì)出現(xiàn)程序,就會(huì)出現(xiàn)IO錯(cuò)誤,程序?qū)⑥D(zhuǎn)入錯(cuò)誤,程序?qū)⑥D(zhuǎn)入catch塊中,給出出錯(cuò)信息塊中,給出出錯(cuò)信息4011.2.1 寫文本
27、文件寫文本文件.n如果需要寫入的內(nèi)容很多,就應(yīng)該使用更為高如果需要寫入的內(nèi)容很多,就應(yīng)該使用更為高效的效的緩沖器流類緩沖器流類BufferedWritern和和BufferedWriter類都用于輸出字符流,包含類都用于輸出字符流,包含的方法幾乎完全一樣,但的方法幾乎完全一樣,但BufferedWriter多提多提供了一個(gè)供了一個(gè)newLine()方法用于換行方法用于換行不同廠家生產(chǎn)的計(jì)算機(jī)不同廠家生產(chǎn)的計(jì)算機(jī) (IBM, Apple, VAX, Sun) 對文字的換行方法不同對文字的換行方法不同。newLine()方法方法可以輸出在當(dāng)前計(jì)算機(jī)上正確的換行符可以輸出在當(dāng)前計(jì)算機(jī)上正確的換行符2
28、) BufferedWriter類類.public static void main ( String args ) throws IOException String = D:newHello.txt ; BufferedWriter out =new BufferedWriter(new ( ); out.write( Hello! ); out.newLine() ; out.write( This is another File); out.close();.11.2.2 讀文本文件讀文本文件 n本節(jié)知識點(diǎn)本節(jié)知識點(diǎn)Reader BufferedReader和和readLine() 4
29、3.n類類從文本文件中讀取字符從文本文件中讀取字符繼承自繼承自Reader抽象類的子類抽象類的子類InputStreamReadernBufferedReader讀文本文件的緩沖器類讀文本文件的緩沖器類具有具有readLine()方法方法,可以對換行符進(jìn)行鑒,可以對換行符進(jìn)行鑒別,一行一行地讀取輸入流中的內(nèi)容別,一行一行地讀取輸入流中的內(nèi)容繼承自繼承自Reader11.2.2 讀文本文件讀文本文件 .n文件輸入方法:文件輸入方法:BufferedReader in= new BufferedReader( new ( ) ); 11.2.2 讀文本文件讀文本文件 .public static
30、void main (String args) String = D:Hello.txt ; String line; try BufferedReader in = new BufferedReader(new (); line = in.readLine(); while ( line != null ) System.out.println( line ); line = in.readLine(); in.close(); catch ( IOException iox ) System.out.println(Problem +); .n對象對象創(chuàng)建后將打開文件,創(chuàng)建后將打開文件,如
31、果文件不存在,會(huì)拋如果文件不存在,會(huì)拋出一個(gè)出一個(gè)IOExceptionnclose()方法方法為了操作系統(tǒng)可以更為有效地利用有限的資為了操作系統(tǒng)可以更為有效地利用有限的資源,應(yīng)該在讀取完畢后,調(diào)用該方法源,應(yīng)該在讀取完畢后,調(diào)用該方法11.2.2 讀文本文件讀文本文件 .nBufferedReader類的類的readLine()方法方法從一個(gè)面向字符的輸入流中讀取從一個(gè)面向字符的輸入流中讀取一行一行文本。文本。如果其中不再有數(shù)據(jù),返回如果其中不再有數(shù)據(jù),返回nullnReader類的類的read()方法方法也可用來判別文件結(jié)束。該方法返回的一個(gè)也可用來判別文件結(jié)束。該方法返回的一個(gè)表示某個(gè)字
32、符的表示某個(gè)字符的int型整數(shù)型整數(shù),如果讀到文件末,如果讀到文件末尾,返回尾,返回 -1。因此可修改本例中讀文件部分因此可修改本例中讀文件部分11.2.2 讀文本文件讀文本文件 int c;while(c=in.read()!= -1) System.out.print(char)c);. 11.2.3 寫二進(jìn)制文件寫二進(jìn)制文件 n本節(jié)知識點(diǎn)本節(jié)知識點(diǎn)二進(jìn)制文件二進(jìn)制文件 OutputStream n nBufferedOutputStream nDataOutputStream.n原則上講,原則上講,所有文件都是由所有文件都是由8位的字節(jié)組成的位的字節(jié)組成的n如果文件字節(jié)中的內(nèi)容應(yīng)被解釋為
33、字符,則如果文件字節(jié)中的內(nèi)容應(yīng)被解釋為字符,則文件被稱為文本文件文件被稱為文本文件;如果被解釋為其它含;如果被解釋為其它含義,則文件被稱為二進(jìn)制文件義,則文件被稱為二進(jìn)制文件n例如文字處理程序,字處理軟件例如文字處理程序,字處理軟件Word產(chǎn)生的產(chǎn)生的doc文件中,數(shù)據(jù)要被解釋為字體、格式、文件中,數(shù)據(jù)要被解釋為字體、格式、圖形和其他非字符信息。因此,這樣的文件圖形和其他非字符信息。因此,這樣的文件是二進(jìn)制文件,不能用是二進(jìn)制文件,不能用Reader流正確讀取流正確讀取 11.2.3 寫二進(jìn)制文件寫二進(jìn)制文件 .n為什么需要二進(jìn)制文件為什么需要二進(jìn)制文件輸入輸出更快輸入輸出更快比文本文件小很多
34、比文本文件小很多有些數(shù)據(jù)不容易被表示為字符有些數(shù)據(jù)不容易被表示為字符 11.2.3 寫二進(jìn)制文件寫二進(jìn)制文件 .1) 抽象類抽象類OutputStreamn提供了提供了3個(gè)個(gè)write方法來做數(shù)據(jù)的輸出方法來做數(shù)據(jù)的輸出public void write(byte b )將參數(shù)將參數(shù)b中的字節(jié)寫到輸出流中的字節(jié)寫到輸出流 public void write(byte b , int off, int len) 將將b從偏移量從偏移量off開始開始len個(gè)字節(jié)寫到輸出流個(gè)字節(jié)寫到輸出流 public abstract void write(int b)先將先將int轉(zhuǎn)換為轉(zhuǎn)換為byte類型,把低
35、字節(jié)寫入輸類型,把低字節(jié)寫入輸出流出流.1) 抽象類抽象類OutputStream主要的子類主要的子類.n派生類派生類作用:用來處理以文件作為數(shù)據(jù)輸出目的數(shù)作用:用來處理以文件作為數(shù)據(jù)輸出目的數(shù)據(jù)流;或者說是從內(nèi)存區(qū)讀數(shù)據(jù)入文件據(jù)流;或者說是從內(nèi)存區(qū)讀數(shù)據(jù)入文件 (File file) n創(chuàng)建一個(gè)向指定創(chuàng)建一個(gè)向指定File對象表示的文件中寫對象表示的文件中寫入數(shù)據(jù)的文件輸出流。入數(shù)據(jù)的文件輸出流。 (String name) n創(chuàng)建一個(gè)向具有指定名稱的文件中寫入數(shù)創(chuàng)建一個(gè)向具有指定名稱的文件中寫入數(shù)據(jù)的輸出文件流。據(jù)的輸出文件流。1) 抽象類抽象類OutputStream.n派生類派生類創(chuàng)建
36、一個(gè)文件流對象創(chuàng)建一個(gè)文件流對象: out=new (d:/write.txt ); File (“d:/write.txt ); out= new (f);1) 抽象類抽象類OutputStream使用鍵盤輸入一段文章,將文章保存在文件使用鍵盤輸入一段文章,將文章保存在文件write.txt中. public static void main(String args) throws IOException try System.out.println(please Input from Keyboard); int count, n = 512; byte buffer = new byte
37、n; count = System.in.read(buffer); wf = new (d:/write.txt); wf.write(buffer, 0, count); wf.close(); System.out.println(Save to the write.txt); catch (IOException IOe) System.out.println(File Write Error!); .n派生類派生類DataOutputStream數(shù)據(jù)輸出流允許應(yīng)用程序以數(shù)據(jù)輸出流允許應(yīng)用程序以適當(dāng)方式適當(dāng)方式將基本將基本 Java 數(shù)據(jù)類型數(shù)據(jù)類型寫入輸出流寫入輸出流中。然后應(yīng)用程中
38、。然后應(yīng)用程序可以使用數(shù)據(jù)輸入流將數(shù)據(jù)讀入。序可以使用數(shù)據(jù)輸入流將數(shù)據(jù)讀入。具有寫各種基本數(shù)據(jù)類型的方法具有寫各種基本數(shù)據(jù)類型的方法將數(shù)據(jù)寫到另一個(gè)輸出流將數(shù)據(jù)寫到另一個(gè)輸出流在所有計(jì)算機(jī)平臺上使用同樣的數(shù)據(jù)格式在所有計(jì)算機(jī)平臺上使用同樣的數(shù)據(jù)格式其中其中size方法,可作為計(jì)數(shù)器,統(tǒng)計(jì)寫入的方法,可作為計(jì)數(shù)器,統(tǒng)計(jì)寫入的字節(jié)數(shù)字節(jié)數(shù)1) 抽象類抽象類OutputStream.名稱 說明 public DataOutputStream(OutputStream out) 構(gòu)造函數(shù),參數(shù)為一個(gè) OutputStream 對象作為其底層的輸出對象 protected int written 私有屬
39、性,代表當(dāng)前已寫出的字節(jié)數(shù) public void flush() 沖刷此數(shù)據(jù)流,使流內(nèi)的數(shù)據(jù)都被寫出 public final int size() 返回私有變量 written 的值,即已經(jīng)寫出的字節(jié)數(shù) public void write(int b) 向底層輸出流輸出 int 變量的低八位。執(zhí)行后,記錄寫入字節(jié)數(shù)的計(jì)數(shù)器加 1 public final void writeBoolean(boolean b) 寫出一個(gè)布爾數(shù),true 為 1,false 為 0,執(zhí)行后計(jì)數(shù)器增加 1 public final void writeByte(int b) 將 int 參數(shù)的低八位寫入,舍棄
40、高 24 位,計(jì)數(shù)器增加 1 11.2.3 寫二進(jìn)制文件寫二進(jìn)制文件 .public void writeBytes(String s) 字符串中的每個(gè)字符被丟掉高八位寫入流中,計(jì)數(shù)器增加寫入的字節(jié)數(shù),即字符個(gè)數(shù) public final void writeChar(int c) 將 16-bit 字符寫入流中,高位在前,計(jì)數(shù)器增加2 public void writeDouble(double v) 寫雙精度數(shù),計(jì)數(shù)器增加 8 public void writeFloat(float f) 寫單精度數(shù),計(jì)數(shù)器增加 4 public void writeInt(int I) 寫整數(shù),計(jì)數(shù)器增
41、加 4 public void writeLong(long l) 寫長整數(shù),計(jì)數(shù)器增加 8 public final void writeShort(int s) 寫短整數(shù),計(jì)數(shù)器增加 2 11.2.3 寫二進(jìn)制文件寫二進(jìn)制文件 .public static void main ( String args ) String = d:/data1.dat ; int value0 =255, value1= 0, value2=-1; try DataOutputStream out = new DataOutputStream( new (); out.writeInt( value0 );
42、 out.writeInt( value1 ); out.writeInt( value2 ); out.close(); catch ( IOException iox ) System.out.println(Problem writing ); .n說明說明類的構(gòu)造方法負(fù)責(zé)打開文件類的構(gòu)造方法負(fù)責(zé)打開文件“data1.dat”用于寫數(shù)據(jù)用于寫數(shù)據(jù)類的對象與類的對象與DataOutputStream對象連接,對象連接,寫基本類型的數(shù)據(jù)寫基本類型的數(shù)據(jù) 11.2.3 寫二進(jìn)制文件寫二進(jìn)制文件 .n運(yùn)行結(jié)果運(yùn)行結(jié)果運(yùn)行程序后,在運(yùn)行程序后,在D盤生成數(shù)據(jù)文件盤生成數(shù)據(jù)文件data1.dat用寫
43、字板打開沒有任何顯示用寫字板打開沒有任何顯示用二進(jìn)制查看器打開查看其二進(jìn)制信息,用二進(jìn)制查看器打開查看其二進(jìn)制信息,內(nèi)容為內(nèi)容為00 00 00 FF 00 00 00 00 FF FF FF FF,每個(gè),每個(gè)int數(shù)字都是數(shù)字都是32個(gè)個(gè)bit的的 11.2.3 寫二進(jìn)制文件寫二進(jìn)制文件 .nBufferedOutputStream類類寫二進(jìn)制文件的緩沖流類寫二進(jìn)制文件的緩沖流類類似于文本文件中的類似于文本文件中的BufferedWriter對于大量數(shù)據(jù)的寫入,可提高效率對于大量數(shù)據(jù)的寫入,可提高效率用法示例:用法示例:DataOutputStream out = new DataOutpu
44、tStream( new BufferedOutputStream( new ( ) ) ); 63 11.2.3 寫二進(jìn)制文件寫二進(jìn)制文件 . public static void main( String args ) throws IOException String = D:/mixedTypes.dat ; DataOutputStream dataOut = new DataOutputStream( new BufferedOutputStream( new ( ); dataOut.writeInt( 0 ); System.out.println( dataOut.size(
45、) + bytes have been written.); dataOut.writeDouble( 31.2 ); System.out.println( dataOut.size() + bytes have been written.); dataOut.writeBytes(JAVA); System.out.println( dataOut.size() + bytes have been written.); dataOut.flush(); dataOut.close(); .n運(yùn)行結(jié)果運(yùn)行結(jié)果4 bytes have been written12 bytes have bee
46、n written16 bytes have been writtenn說明說明這個(gè)程序可作為字節(jié)計(jì)數(shù)器這個(gè)程序可作為字節(jié)計(jì)數(shù)器 11.2.3 寫二進(jìn)制文件寫二進(jìn)制文件 . 11.2.4 讀二進(jìn)制文件讀二進(jìn)制文件 n本節(jié)知識點(diǎn)本節(jié)知識點(diǎn)DataInputStreamBufferedInputSteam 讀寫整數(shù)讀寫整數(shù) 讀寫單字節(jié)讀寫單字節(jié) .1) 抽象類抽象類InputStreamInputstream類中的常用方法類中的常用方法npublic abstract int read( ):讀取一個(gè):讀取一個(gè)byte的數(shù)的數(shù)據(jù),返回值是高位補(bǔ)據(jù),返回值是高位補(bǔ)0的的int類型值。類型值。npub
47、lic int read(byte b ):讀?。鹤x取b.length個(gè)字節(jié)個(gè)字節(jié)的數(shù)據(jù)放到的數(shù)據(jù)放到b數(shù)組中。返回值是讀取的字節(jié)數(shù)。數(shù)組中。返回值是讀取的字節(jié)數(shù)。npublic int read(byte b , int off, int len):讀?。鹤x取len個(gè)字節(jié)的數(shù)據(jù),存放到偏移量為個(gè)字節(jié)的數(shù)據(jù),存放到偏移量為off的的b數(shù)組中數(shù)組中npublic long skip(long n):忽略輸入流中的:忽略輸入流中的n個(gè)個(gè)字節(jié),跳過一些字節(jié)來讀取字節(jié),跳過一些字節(jié)來讀取.n派生類派生類作用:以文件作為數(shù)據(jù)輸入源的數(shù)據(jù)流?;蜃饔茫阂晕募鳛閿?shù)據(jù)輸入源的數(shù)據(jù)流?;蛘哒f是打開文件,從文件讀
48、數(shù)據(jù)到內(nèi)存的類者說是打開文件,從文件讀數(shù)據(jù)到內(nèi)存的類(String name) n通過文件系統(tǒng)中的路徑名通過文件系統(tǒng)中的路徑名name創(chuàng)建一個(gè)創(chuàng)建一個(gè)對象。對象。 (File file) n通過通過File對象創(chuàng)建一個(gè)對象。允許在把文對象創(chuàng)建一個(gè)對象。允許在把文件連接到輸入流之前對文件做進(jìn)一步分析,件連接到輸入流之前對文件做進(jìn)一步分析,如修改寫入刪除等等如修改寫入刪除等等1) 抽象類抽象類InputStream.n派生類派生類使用方法使用方法: File(d:/abc.txt); in=new ( fin); in=new (d: /abc.txt);1) 抽象類抽象類InputStream.
49、1) 抽象類抽象類InputStreamnDataInputStream intread(byte b) intread(byte b, int off, int len) booleanreadBoolean() bytereadByte() charreadChar() doublereadDouble() floatreadFloat() intreadInt() longreadLong() shortreadShort() .public static void main ( String args ) String fName = D:data1.dat; int sum = 0;
50、 try DataInputStream instr = new DataInputStream( new BufferedInputStream( new ( ); sum += instr.readInt(); sum += instr.readInt(); sum += instr.readInt(); System.out.println( The sum is: +sum); instr.close(); catch ( IOException iox ) System.out.println(Problem reading + ); .nreadInt方法可以從輸入流中讀入方法可以
51、從輸入流中讀入4個(gè)字節(jié)并個(gè)字節(jié)并將其當(dāng)作將其當(dāng)作int型數(shù)據(jù)型數(shù)據(jù)n由于知道文件中存儲(chǔ)的是由于知道文件中存儲(chǔ)的是3個(gè)個(gè)int型數(shù)據(jù),所型數(shù)據(jù),所以使用了以使用了3個(gè)讀入語句個(gè)讀入語句n如果不知道數(shù)據(jù)的個(gè)數(shù)該怎么辦呢?因?yàn)槿绻恢罃?shù)據(jù)的個(gè)數(shù)該怎么辦呢?因?yàn)镈ataInputStream的讀入操作如遇到文件結(jié)的讀入操作如遇到文件結(jié)尾就會(huì)拋出尾就會(huì)拋出EOFException異常,所以我們異常,所以我們可以將讀操作放入可以將讀操作放入try塊中塊中 11.2.4 讀二進(jìn)制文件讀二進(jìn)制文件 .public static void main(String args) throws IOExceptio
52、n s=new (d:/Hello.txt); int c; while (c = s.read() != -1) /讀取1字節(jié),結(jié)束返回-1 System.out.write(c); s.close();. public static void main(String args) throws Exception DataOutputStream out= new DataOutputStream( new (D:/trytry.dat); out.writeByte(-1); out.close(); DataInputStream in=new DataInputStream( new
53、(D:/trytry.dat); int a=in.readByte(); System.out.println(Integer.toHexString (a); System.out.println(a); in.skip (-1); /往后一個(gè)位置,以便下面重新讀出 a=in.readUnsignedByte(); System.out.println(Integer.toHexString (a); System.out.println(a); in.close(); 運(yùn)行結(jié)果ffffffff-1ff255.n用二進(jìn)制查看器打開用二進(jìn)制查看器打開D:/trytry.dat文件,其文件,其
54、內(nèi)容為內(nèi)容為FFn如果用如果用readByte讀入,其高讀入,其高24位都將補(bǔ)位都將補(bǔ)1,所以結(jié)果還是所以結(jié)果還是-1n如果用如果用readUnsignedByte讀入,其高讀入,其高24位位都將補(bǔ)都將補(bǔ)0,結(jié)果就變成了,結(jié)果就變成了255n寫的字節(jié)是連續(xù)的,中間沒有分隔符,所以寫的字節(jié)是連續(xù)的,中間沒有分隔符,所以應(yīng)該記住寫的數(shù)據(jù)類型、個(gè)數(shù)等情況,以便應(yīng)該記住寫的數(shù)據(jù)類型、個(gè)數(shù)等情況,以便將來利用將來利用 11.2.4 讀二進(jìn)制文件讀二進(jìn)制文件 .11.2.5 處理壓縮文件處理壓縮文件n壓縮流類壓縮流類java.util.zip包中提供了一些類,使我們可以包中提供了一些類,使我們可以以以壓縮格式壓縮格式對流進(jìn)行讀寫對流進(jìn)行讀寫它們都繼承自字節(jié)流類它們都繼承自字節(jié)流類OutputStream和和InputStream其中其中GZIPOutputStream和和ZipOutputStream可分別把數(shù)據(jù)壓縮成可分別把數(shù)據(jù)壓縮成GZIP格式和格式和Zip格式格式GZIPInputStream和和ZipInputStream可以分可以分別把壓縮成別把壓縮成GZIP格式或格式或Zip的數(shù)據(jù)解壓縮恢復(fù)的數(shù)據(jù)解壓縮恢復(fù)原狀原狀.11.2.5 處理壓縮文件處理壓縮文件n如果要從如果要從ZIP壓縮管理文件內(nèi)讀取某個(gè)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 海洋氣象觀測數(shù)據(jù)的質(zhì)量控制與保障考核試卷
- 罐頭食品企業(yè)環(huán)境保護(hù)與綠色生產(chǎn)考核試卷
- 煤炭市場結(jié)構(gòu)優(yōu)化與產(chǎn)業(yè)發(fā)展考核試卷
- 煤炭洗選工藝設(shè)計(jì)與實(shí)踐考核試卷
- 吉林省遼源市第五中學(xué)2024-2025學(xué)年高三下期末質(zhì)量檢查生物試題理試題含解析
- 山東省樂陵市花園鎮(zhèn)達(dá)標(biāo)名校2025屆初三實(shí)驗(yàn)班第一次質(zhì)檢數(shù)學(xué)試題試卷含解析
- 江蘇省淮安市洪澤縣2024-2025學(xué)年初三下學(xué)期第二次模擬考試語文試題試卷含解析
- 內(nèi)蒙古呼和浩特市2024-2025學(xué)年高三第二學(xué)期期終學(xué)習(xí)質(zhì)量調(diào)研測試歷史試題含解析
- 吉林省長春市榆樹市2024-2025學(xué)年高三第五次模擬考試數(shù)學(xué)試題試卷含解析
- 西藏拉薩市墨竹工卡縣2025屆小升初全真模擬數(shù)學(xué)檢測卷含解析
- 《無人機(jī)測繪技能訓(xùn)練模塊》課件-模塊7:無人機(jī)航測影像獲取
- 人工髖關(guān)節(jié)置換隨訪資料庫模板
- (完整版)12123交管學(xué)法減分考試題及答案
- 腦干的解剖及臨床綜合征
- 人教版高一下學(xué)期期中考試數(shù)學(xué)試卷及答案解析(共五套)
- (高清版)JTG 3810-2017 公路工程建設(shè)項(xiàng)目造價(jià)文件管理導(dǎo)則
- FZ∕T 74001-2020 紡織品 針織運(yùn)動(dòng)護(hù)具
- 人體常見病 知到智慧樹網(wǎng)課答案
- 幼兒詩歌《家》課件
- 2024年4月自考00043經(jīng)濟(jì)法概論(財(cái)經(jīng)類)試題
- MOOC 大話法醫(yī)學(xué)-華中科技大學(xué) 中國大學(xué)慕課答案
評論
0/150
提交評論