輸入輸出課件_第1頁
輸入輸出課件_第2頁
輸入輸出課件_第3頁
輸入輸出課件_第4頁
輸入輸出課件_第5頁
已閱讀5頁,還剩159頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第11章輸入/輸出本章要點(diǎn)了解Java中流的概念了解Java中輸入輸出流的分類掌握文件輸入輸出流的使用方法掌握帶緩存的輸入輸出流的使用了解ZIP壓縮輸入輸出流的應(yīng)用第11章輸入/輸出本章要點(diǎn)了解Java中流的概念第11章輸入/輸出11.1輸入/輸出流11.2文件讀寫主要內(nèi)容第11章輸入/輸出11.1輸入/輸出流主要內(nèi)容11.1輸入/輸出流通常程序需要從外部獲取/輸出信息這個(gè)“外部”范圍很廣,包括諸如鍵盤、顯示器、文件、磁盤、網(wǎng)絡(luò)、另外一個(gè)程序等“信息”也可以是任何類型的,例如一個(gè)對象、字符串、圖像、聲音等通過使用java.io包中的輸入/輸出流類就可以達(dá)到輸入輸出信息的目的11.1輸入/輸出流通常程序需要從外部獲取/輸出信息Java所有的I/O機(jī)制都是基于數(shù)據(jù)流進(jìn)行輸入輸出,這些數(shù)據(jù)流表示了字符或者字節(jié)數(shù)據(jù)的流動(dòng)序列。Java的I/O流提供了讀寫數(shù)據(jù)的標(biāo)準(zhǔn)方法任何Java中表示數(shù)據(jù)源的對象都會(huì)提供以數(shù)據(jù)流的方式讀寫它的數(shù)據(jù)的方法。Java.io是大多數(shù)面向數(shù)據(jù)流的輸入/輸出類的主要軟件包。11.1輸入/輸出流Java所有的I/O機(jī)制都是基于數(shù)據(jù)流進(jìn)行輸入輸出,這些數(shù)據(jù)數(shù)據(jù)流是一串連續(xù)不斷的數(shù)據(jù)的集合。數(shù)據(jù)寫入程序可以是一段、一段地向數(shù)據(jù)流管道中寫入數(shù)據(jù),這些數(shù)據(jù)段會(huì)按先后順序形成一個(gè)長的數(shù)據(jù)流。對數(shù)據(jù)讀取程序來說,看不到數(shù)據(jù)流在寫入時(shí)的分段情況,每次可以讀取其中的任意長度的數(shù)據(jù),但只能先讀取前面的數(shù)據(jù)后,再讀取后面的數(shù)據(jù)。11.1輸入/輸出流數(shù)據(jù)流是一串連續(xù)不斷的數(shù)據(jù)的集合。11.1輸入/輸出流一組有序,有起點(diǎn)和終點(diǎn)的字節(jié)的數(shù)據(jù)序列。包括輸入流和輸出流。11.1輸入/輸出流一組有序,有起點(diǎn)和終點(diǎn)的字節(jié)的數(shù)據(jù)序列。11.1輸入/輸出11.1.1I/O流的概念在Java中將信息的輸入輸出過程抽象為I/O流輸入是指數(shù)據(jù)流入程序輸出是指數(shù)據(jù)從程序流出一個(gè)流就是一個(gè)從源流向目的地的數(shù)據(jù)序列IO流類一旦被創(chuàng)建就會(huì)自動(dòng)打開通過調(diào)用close方法,可以顯式關(guān)閉任何一個(gè)流,如果流對象不再被引用,Java的垃圾回收機(jī)制也會(huì)隱式地關(guān)閉它11.1.1I/O流的概念在Java中將信息的輸入輸出過11.1.1I/O流的概念輸入流為了從信息源獲取信息,程序打開一個(gè)輸入流,程序可從輸入流讀取信息11.1.1I/O流的概念輸入流11.1.1I/O流的概念輸出流當(dāng)程序需要向目標(biāo)位置寫信息時(shí),便需要打開一個(gè)輸出流,程序通過輸出流向這個(gè)目標(biāo)位置寫信息911.1.1I/O流的概念輸出流9

對象源?/目標(biāo)?或兩者?diskfile

runningprogram

monitor

keyboard

Internetconnection

imagescanner

mouse

BothBothDestinationSourceBothSourceSource11.1.1I/O流的概念源和目標(biāo)的類型

對象源?/目標(biāo)?或兩者?diskfile

runni讀寫數(shù)據(jù)的方法不論數(shù)據(jù)從哪來,到哪去,也不論數(shù)據(jù)本身是何類型,讀寫數(shù)據(jù)的方法大體上都是一樣的讀寫打開一個(gè)流讀信息關(guān)閉流打開一個(gè)流寫信息關(guān)閉流11.1.1I/O流的概念讀寫數(shù)據(jù)的方法讀寫11.1.1I/O流的概念11.1.1I/O流的概念緩沖流:為流配備一個(gè)緩沖區(qū)(buffer)緩沖區(qū)就是一塊存儲區(qū)域,用來輔助與外部設(shè)備的數(shù)據(jù)傳輸,從而提高數(shù)據(jù)的傳輸效率在實(shí)現(xiàn)寫數(shù)據(jù)時(shí),先將這些數(shù)據(jù)寫入流緩沖區(qū),而并不直接將它們送入輸出設(shè)備,流緩沖區(qū)的數(shù)據(jù)量會(huì)被自動(dòng)地跟蹤,一旦發(fā)現(xiàn)緩沖區(qū)滿了,就會(huì)將其中的數(shù)據(jù)一次性傳輸?shù)酵獠吭O(shè)備上,緩沖區(qū)變?yōu)榭湛梢詼p少與外部設(shè)備打交道的次數(shù)11.1.1I/O流的概念緩沖流:為流配備一個(gè)緩沖區(qū)(bu11.1.2預(yù)定義的I/O流類概述從流的方向劃分輸入流輸出流從流的分工劃分節(jié)點(diǎn)流處理流從流的內(nèi)容劃分面向字符的流(字符流)面向字節(jié)的流(二進(jìn)制流)11.1.2預(yù)定義的I/O流類概述從流的方向劃分11.1.2預(yù)定義的I/O流類概述java.io包的頂級層次結(jié)構(gòu)面向字符的流:專門用于字符數(shù)據(jù)面向字節(jié)的流:用于一般目的

11.1.2預(yù)定義的I/O流類概述java.io包的頂級層1)面向字符的流面向字符的流針對字符數(shù)據(jù)的特點(diǎn)進(jìn)行過優(yōu)化,提供一些面向字符的有用特性源或目標(biāo)通常是文本文件1)面向字符的流面向字符的流面向字符的抽象類——Reader和Writerjava.io包中所有字符流的抽象基類Reader提供了輸入字符的APIWriter提供了輸出字符的API多數(shù)程序使用這兩個(gè)抽象類的一系列子類來讀入/寫出文本信息1)面向字符的流面向字符的抽象類——Reader和Writer1)面向字符陰影部分為節(jié)點(diǎn)流1)面向字符的流陰影部分為節(jié)點(diǎn)流1)面向字符的流數(shù)據(jù)源或目標(biāo)中含有非字符數(shù)據(jù),必須用字節(jié)流來輸入/輸出通常被用來讀寫諸如圖片、聲音之類的二進(jìn)制數(shù)據(jù)絕大多數(shù)數(shù)據(jù)是被存儲為二進(jìn)制文件的,世界上的文本文件大約只能占到2%,通常二進(jìn)制文件要比含有相同數(shù)據(jù)量的文本文件小得多2)面向字節(jié)的流數(shù)據(jù)源或目標(biāo)中含有非字符數(shù)據(jù),必須用字節(jié)流來輸入/輸出2)InputStream和OutputStream是用來處理8位字節(jié)流的抽象基類,程序使用這兩個(gè)類的子類來讀寫8位的字節(jié)信息分為兩部分節(jié)點(diǎn)流處理流2)面向字節(jié)的流InputStream和OutputStream2)面向字陰影部分為節(jié)點(diǎn)流2)面向字節(jié)的流陰影部分為節(jié)點(diǎn)流2)面向字節(jié)的流3)標(biāo)準(zhǔn)輸入輸出標(biāo)準(zhǔn)輸入輸出流對象,System類靜態(tài)成員變量System.in:InputStream類型的,代表標(biāo)準(zhǔn)輸入流,這個(gè)流是已經(jīng)打開了的,默認(rèn)狀態(tài)對應(yīng)于鍵盤輸入。System.out:PrintStream類型的,代表標(biāo)準(zhǔn)輸出流,默認(rèn)狀態(tài)對應(yīng)于屏幕輸出System.err:PrintStream類型的,代表標(biāo)準(zhǔn)錯(cuò)誤信息輸出流,默認(rèn)狀態(tài)對應(yīng)屏幕輸出3)標(biāo)準(zhǔn)輸入輸出標(biāo)準(zhǔn)輸入輸出流對象,System類靜態(tài)成員publicclassEcho{publicstaticvoidmain(String[]args)throwsIOException{

BufferedReaderin=newBufferedReader(newInputStreamReader(System.in));Strings;while((s=in.readLine()).length()!=0)System.out.println(s);}}運(yùn)行結(jié)果Hello!Hello!publicclassEcho{運(yùn)行結(jié)果System.in程序啟動(dòng)時(shí)由Java系統(tǒng)自動(dòng)創(chuàng)建的流對象,它是原始的字節(jié)流,不能直接從中讀取字符,需要對其進(jìn)行進(jìn)一步的處理InputStreamReader(System.in)以System.in為參數(shù)創(chuàng)建一個(gè)InputStreamReader流對象,相當(dāng)于字節(jié)流和字符流之間的一座橋梁,讀取字節(jié)并將其轉(zhuǎn)換為字符BufferedReaderin對InputStreamReader處理后的信息進(jìn)行緩沖,以提高效率System.in4)處理流不直接與數(shù)據(jù)源或目標(biāo)相連,而是基于另一個(gè)流來構(gòu)造從流讀寫數(shù)據(jù)的同時(shí)對數(shù)據(jù)進(jìn)行處理實(shí)例中的InputStreamReader和BufferedReader都屬于處理流InputStreamReader讀取字節(jié)并轉(zhuǎn)換為字符BufferedReader對另一個(gè)流產(chǎn)生的數(shù)據(jù)進(jìn)行緩沖4)處理流不直接與數(shù)據(jù)源或目標(biāo)相連,而是基于另一個(gè)流來構(gòu)造用一行表達(dá)式實(shí)現(xiàn):BufferedReaderstdin=newBufferedReader(newInputStreamReader(System.in));

4)處理流用一行表達(dá)式實(shí)現(xiàn):

5)I/O異常多數(shù)IO方法在遇到錯(cuò)誤時(shí)會(huì)拋出異常,因此調(diào)用這些方法時(shí)必須在方法頭聲明拋出IOException異常或者在try塊中執(zhí)行IO,然后捕獲IOException5)I/O異常多數(shù)IO方法在遇到錯(cuò)誤時(shí)會(huì)拋出異常,因此調(diào)用

11.1.3File類表示磁盤文件信息定義了一些與平臺無關(guān)的方法來操縱文件創(chuàng)建、刪除文件重命名文件判斷文件的讀寫權(quán)限及是否存在設(shè)置和查詢文件的最近修改時(shí)間等構(gòu)造文件流可以使用File類的對象作為參數(shù)11.1.3File類表示磁盤文件信息

11.1.3File類11.1.3File類

11.1.3File類11.1.3File類public

static

void

main(String[]args)throwsIOException{

Filef=newFile("D:"+File.separator+"Hello.txt");

if(f.exists())

f.delete();

else

try{

f.createNewFile();

}catch(Exceptione){System.out.println(e.getMessage());}}publicstaticvoidmain(String運(yùn)行結(jié)果因?yàn)樵诶?1_2中已經(jīng)創(chuàng)建了d:\Hello.txt,所以第一次運(yùn)行將刪除這個(gè)文件第二次運(yùn)行則又創(chuàng)建了一個(gè)此名的空文件分析在試圖打開文件之前,可以使用File類的isFile方法來確定File對象是否代表一個(gè)文件而非目錄)還可通過exists方法判斷同名文件或路徑是否存在,進(jìn)而采取正確的方法,以免造成誤操作31

11.1.3File類運(yùn)行結(jié)果3111.1.3File類11.2文件讀寫11.2.1寫文本文件11.2.2讀文本文件11.2.3寫二進(jìn)制文件11.2.4讀二進(jìn)制文件11.2.5處理壓縮文件11.2.6對象序列化11.2文件讀寫11.2.1寫文本文件11.2.1寫文本文件本節(jié)知識點(diǎn)FileWriter類創(chuàng)建一個(gè)磁盤文件關(guān)閉一個(gè)磁盤文件write()方法捕獲I/O異常BufferedWriter類11.2.1寫文本文件本節(jié)知識點(diǎn)1)FileWriter類(字符輸出流類)構(gòu)造方法FileWriterfw=newFileWriter(StringfileName);創(chuàng)建字符輸出流類對象和已存在的文件相關(guān)聯(lián)。文件不存在,則創(chuàng)建。FileWriterfw=newFileWriter(StringfileName,booleanappend);創(chuàng)建字符輸出流類對象和已存在的文件相關(guān)聯(lián),并設(shè)置該該流對文件的操作是否為續(xù)寫FileWriterfw=newFileWriter("C:\\demo.txt");FileWriterfw=newFileWriter("C:\\demo.txt",ture);1)FileWriter類(字符輸出流類)構(gòu)造方法File1)FileWriter類(字符輸出流類)主要方法voidwrite(Stringstr)

寫入字符串。viodflush()

刷新該流中的緩沖。viodclose()

關(guān)閉此流。1)FileWriter類(字符輸出流類)主要方法11.2.1寫文本文件【例】在C盤根目錄創(chuàng)建文本文件Hello.txt,并往里寫入若干行文本public

static

voidmain(String[]args)throwsIOException{

StringfileName="D:\\Hello.txt";

FileWriterwriter=newFileWriter(fileName);

writer.write("Hello!\n");

writer.write("Thisisafile\n");

writer.close();}11.2.1寫文本文件【例】在C盤根目錄創(chuàng)建文本文件Hel每次運(yùn)行這個(gè)程序,都將刪除已經(jīng)存在的”Hello.txt”文件,創(chuàng)建一個(gè)新的同名文件FileWriter的構(gòu)造方法有五個(gè),本例是通過一個(gè)字符串指定文件名來創(chuàng)建FileWriter類的write方法向文件中寫入字符close方法清空流里的內(nèi)容并關(guān)閉它。如果不調(diào)用該方法,可能系統(tǒng)還沒有完成所有數(shù)據(jù)的寫操作,程序就結(jié)束了11.2.1寫文本文件--實(shí)例說明每次運(yùn)行這個(gè)程序,都將刪除已經(jīng)存在的”Hello.txt”文Writer類的流可實(shí)現(xiàn)內(nèi)部格式到外部磁盤文件格式的轉(zhuǎn)換“Hello.txt”是一個(gè)普通的ASCII碼文本文件,英文字符占一個(gè)字節(jié),中文字符占兩個(gè)字節(jié)Java程序中的字符串則是每個(gè)字符占兩個(gè)字節(jié)的,采用Unicode編碼11.2.1寫文本文件--實(shí)例說明Writer類的流可實(shí)現(xiàn)內(nèi)部格式到外部磁盤文件格式的轉(zhuǎn)換11public

static

voidmain(String[]args){StringfileName="D:\\Hello.txt";

try{

//將所有IO操作放入try塊中

FileWriterwriter=newFileWriter(fileName,true);writer.write("Hello!\n");writer.write("Thisisatextfile\n");

writer.close();

}catch(IOExceptioniox){

System.out.println("Problemwriting"+fileName);

}}publicstaticvoidmain(Stri運(yùn)行此程序,會(huì)發(fā)現(xiàn)在原文件內(nèi)容后面又追加了重復(fù)的內(nèi)容,這就是將構(gòu)造方法的第二個(gè)參數(shù)設(shè)為true的效果如果將文件屬性改為只讀屬性,再運(yùn)行本程序,就會(huì)出現(xiàn)IO錯(cuò)誤,程序?qū)⑥D(zhuǎn)入catch塊中,給出出錯(cuò)信息4011.2.1寫文本文件運(yùn)行此程序,會(huì)發(fā)現(xiàn)在原文件內(nèi)容后面又追加了重復(fù)的內(nèi)容,這就是如果需要寫入的內(nèi)容很多,就應(yīng)該使用更為高效的緩沖器流類BufferedWriterFileWriter和BufferedWriter類都用于輸出字符流,包含的方法幾乎完全一樣,但BufferedWriter多提供了一個(gè)newLine()方法用于換行不同廠家生產(chǎn)的計(jì)算機(jī)(IBM,Apple,VAX,Sun)對文字的換行方法不同。newLine()方法可以輸出在當(dāng)前計(jì)算機(jī)上正確的換行符2)BufferedWriter類如果需要寫入的內(nèi)容很多,就應(yīng)該使用更為高效的緩沖器流類Bufpublic

static

voidmain(String[]args)throwsIOException{StringfileName="D:\\newHello.txt";

BufferedWriterout

=newBufferedWriter(

newFileWriter(fileName

));out.write("Hello!");out.newLine();out.write("ThisisanotherFile");out.close();}publicstaticvoidmain(Stri11.2.2讀文本文件本節(jié)知識點(diǎn)ReaderFileReaderBufferedReader和readLine()4311.2.2讀文本文件本節(jié)知識點(diǎn)43FileReader類從文本文件中讀取字符繼承自Reader抽象類的子類InputStreamReaderBufferedReader讀文本文件的緩沖器類具有readLine()方法,可以對換行符進(jìn)行鑒別,一行一行地讀取輸入流中的內(nèi)容繼承自Reader11.2.2讀文本文件FileReader類11.2.2讀文本文件文件輸入方法:BufferedReaderin=newBufferedReader(new

FileReader(fileName));

11.2.2讀文本文件文件輸入方法:

public

static

voidmain(String[]args){StringfileName="D:\\Hello.txt";Stringline;

try{

BufferedReaderin=newBufferedReader(

newFileReader(fileName));

line=in.readLine();

while(line!=null){System.out.println(line);line=in.readLine();}in.close();

}catch(IOExceptioniox){System.out.println("Problem"+fileName);}}publicstaticvoidmain(StrinFileReader對象創(chuàng)建后將打開文件,如果文件不存在,會(huì)拋出一個(gè)IOExceptionclose()方法為了操作系統(tǒng)可以更為有效地利用有限的資源,應(yīng)該在讀取完畢后,調(diào)用該方法11.2.2讀文本文件FileReader對象11.2.2讀文本文件BufferedReader類的readLine()方法從一個(gè)面向字符的輸入流中讀取一行文本。如果其中不再有數(shù)據(jù),返回nullReader類的read()方法也可用來判別文件結(jié)束。該方法返回的一個(gè)表示某個(gè)字符的int型整數(shù),如果讀到文件末尾,返回-1。因此可修改本例中讀文件部分11.2.2讀文本文件intc;while((c=in.read())!=-1)

System.out.print((char)c);BufferedReader類的readLine()方法11

11.2.3寫二進(jìn)制文件本節(jié)知識點(diǎn)二進(jìn)制文件OutputStreamFileOutputStreamBufferedOutputStreamDataOutputStream11.2.3寫二進(jìn)制文件本節(jié)知識點(diǎn)原則上講,所有文件都是由8位的字節(jié)組成的如果文件字節(jié)中的內(nèi)容應(yīng)被解釋為字符,則文件被稱為文本文件;如果被解釋為其它含義,則文件被稱為二進(jìn)制文件例如文字處理程序,字處理軟件Word產(chǎn)生的doc文件中,數(shù)據(jù)要被解釋為字體、格式、圖形和其他非字符信息。因此,這樣的文件是二進(jìn)制文件,不能用Reader流正確讀取

11.2.3寫二進(jìn)制文件原則上講,所有文件都是由8位的字節(jié)組成的11.2.3寫二為什么需要二進(jìn)制文件輸入輸出更快比文本文件小很多有些數(shù)據(jù)不容易被表示為字符

11.2.3寫二進(jìn)制文件為什么需要二進(jìn)制文件11.2.3寫二進(jìn)制文件1)抽象類OutputStream提供了3個(gè)write方法來做數(shù)據(jù)的輸出 publicvoidwrite(byteb[])將參數(shù)b中的字節(jié)寫到輸出流 publicvoidwrite(byteb[],intoff,intlen)

將b從偏移量off開始len個(gè)字節(jié)寫到輸出流 publicabstractvoidwrite(intb)先將int轉(zhuǎn)換為byte類型,把低字節(jié)寫入輸出流1)抽象類OutputStream提供了3個(gè)write方法1)抽象類OutputStream主要的子類1)抽象類OutputStream主要的子類派生類FileOutputStream作用:用來處理以文件作為數(shù)據(jù)輸出目的數(shù)據(jù)流;或者說是從內(nèi)存區(qū)讀數(shù)據(jù)入文件FileOutputStream(Filefile)

創(chuàng)建一個(gè)向指定File對象表示的文件中寫入數(shù)據(jù)的文件輸出流。

FileOutputStream(Stringname)

創(chuàng)建一個(gè)向具有指定名稱的文件中寫入數(shù)據(jù)的輸出文件流。1)抽象類OutputStream派生類FileOutputStream1)抽象類Outpu派生類FileOutputStream創(chuàng)建一個(gè)文件流對象:FileOutputStreamout=

newFileOutputStream("d:/write.txt");

Filef=newFile(“d:/write.txt");FileOutputStreamout=newFileOutputStream(f);1)抽象類OutputStream使用鍵盤輸入一段文章,將文章保存在文件write.txt中派生類FileOutputStream1)抽象類Outpu

public

static

void

main(Stringargs[])throwsIOException{

try{System.out.println("pleaseInputfromKeyboard");

intcount,n=512;

bytebuffer[]=new

byte[n];count=System.in.read(buffer);

FileOutputStreamwf=newFileOutputStream("d:/write.txt");

wf.write(buffer,0,count);

wf.close();

System.out.println("Savetothewrite.txt");}catch(IOExceptionIOe){System.out.println("FileWriteError!");}}publicstaticvoidmain(Strin派生類DataOutputStream數(shù)據(jù)輸出流允許應(yīng)用程序以適當(dāng)方式將基本Java數(shù)據(jù)類型寫入輸出流中。然后應(yīng)用程序可以使用數(shù)據(jù)輸入流將數(shù)據(jù)讀入。具有寫各種基本數(shù)據(jù)類型的方法將數(shù)據(jù)寫到另一個(gè)輸出流在所有計(jì)算機(jī)平臺上使用同樣的數(shù)據(jù)格式其中size方法,可作為計(jì)數(shù)器,統(tǒng)計(jì)寫入的字節(jié)數(shù)1)抽象類OutputStream派生類DataOutputStream1)抽象類Outpu

11.2.3寫二進(jìn)制文件11.2.3寫二進(jìn)制文件

11.2.3寫二進(jìn)制文件11.2.3寫二進(jìn)制文件public

static

voidmain(String[]args){StringfileName="d:/data1.dat";

intvalue0=255,value1=0,value2=-1;

try{

DataOutputStreamout=newDataOutputStream(newFileOutputStream(fileName));out.writeInt(value0);out.writeInt(value1);out.writeInt(value2);out.close();}catch(IOExceptioniox){System.out.println("Problemwriting");}}publicstaticvoidmain(Stri說明FileOutputStream類的構(gòu)造方法負(fù)責(zé)打開文件“data1.dat”用于寫數(shù)據(jù)FileOutputStream類的對象與DataOutputStream對象連接,寫基本類型的數(shù)據(jù)

11.2.3寫二進(jìn)制文件說明11.2.3寫二進(jìn)制文件運(yùn)行結(jié)果運(yùn)行程序后,在D盤生成數(shù)據(jù)文件data1.dat用寫字板打開沒有任何顯示用二進(jìn)制查看器打開查看其二進(jìn)制信息,內(nèi)容為000000FF00000000FFFFFFFF,每個(gè)int數(shù)字都是32個(gè)bit的

11.2.3寫二進(jìn)制文件運(yùn)行結(jié)果11.2.3寫二進(jìn)制文件BufferedOutputStream類寫二進(jìn)制文件的緩沖流類類似于文本文件中的BufferedWriter對于大量數(shù)據(jù)的寫入,可提高效率用法示例:DataOutputStreamout=newDataOutputStream(newBufferedOutputStream(newFileOutputStream(fileName)));

63

11.2.3寫二進(jìn)制文件BufferedOutputStream類6311.2.3

public

static

voidmain(String[]args)throwsIOException{

StringfileName="D:/mixedTypes.dat";DataOutputStreamdataOut=

newDataOutputStream(

newBufferedOutputStream(

newFileOutputStream(fileName)));

dataOut.writeInt(0);System.out.println(dataOut.size()+"byteshavebeenwritten.");

dataOut.writeDouble(31.2);System.out.println(dataOut.size()+"byteshavebeenwritten.");

dataOut.writeBytes("JAVA");System.out.println(dataOut.size()+"byteshavebeenwritten.");dataOut.flush();dataOut.close();}publicstaticvoidmain(Stri運(yùn)行結(jié)果4byteshavebeenwritten12byteshavebeenwritten16byteshavebeenwritten說明這個(gè)程序可作為字節(jié)計(jì)數(shù)器

11.2.3寫二進(jìn)制文件運(yùn)行結(jié)果11.2.3寫二進(jìn)制文件

11.2.4讀二進(jìn)制文件本節(jié)知識點(diǎn)FileInputStreamDataInputStreamBufferedInputSteam讀寫整數(shù)讀寫單字節(jié)11.2.4讀二進(jìn)制文件本節(jié)知識點(diǎn)1)抽象類InputStreamInputstream類中的常用方法publicabstractintread():讀取一個(gè)byte的數(shù)據(jù),返回值是高位補(bǔ)0的int類型值。publicintread(byteb[]):讀取b.length個(gè)字節(jié)的數(shù)據(jù)放到b數(shù)組中。返回值是讀取的字節(jié)數(shù)。publicintread(byteb[],intoff,intlen):讀取len個(gè)字節(jié)的數(shù)據(jù),存放到偏移量為off的b數(shù)組中publiclongskip(longn):忽略輸入流中的n個(gè)字節(jié),跳過一些字節(jié)來讀取1)抽象類InputStreamInputstream類中派生類FileIntputStream作用:以文件作為數(shù)據(jù)輸入源的數(shù)據(jù)流。或者說是打開文件,從文件讀數(shù)據(jù)到內(nèi)存的類FileInputStream(Stringname)

通過文件系統(tǒng)中的路徑名name創(chuàng)建一個(gè)FileInputStream對象。FileInputStream(Filefile)

通過File對象創(chuàng)建一個(gè)FileInputStream對象。允許在把文件連接到輸入流之前對文件做進(jìn)一步分析,如修改寫入刪除等等1)抽象類InputStream派生類FileIntputStream1)抽象類Input派生類FileIntputStream使用方法:Filefin=newFile("d:/abc.txt");FileInputStreamin=newFileInputStream(fin);FileInputStreamin=newFileInputStream("d:/abc.txt");1)抽象類InputStream派生類FileIntputStream1)抽象類Input1)抽象類InputStreamDataInputStream

intread(byte[]b)

intread(byte[]b,intoff,intlen)

booleanreadBoolean()

bytereadByte()

charreadChar()

doublereadDouble()

floatreadFloat()

intreadInt()

longreadLong()

shortreadShort()

1)抽象類InputStreamDataInputStrepublic

static

voidmain(String[]args){StringfName="D:\\data1.dat";

intsum=0;

try{

DataInputStreaminstr=newDataInputStream(

newBufferedInputStream(newFileInputStream(fileName)));sum+=instr.readInt();sum+=instr.readInt();sum+=instr.readInt();System.out.println("Thesumis:"+sum);

instr.close();

}catch(IOExceptioniox){System.out.println("Problemreading"+fileName);}}publicstaticvoidmain(StrireadInt方法可以從輸入流中讀入4個(gè)字節(jié)并將其當(dāng)作int型數(shù)據(jù)由于知道文件中存儲的是3個(gè)int型數(shù)據(jù),所以使用了3個(gè)讀入語句如果不知道數(shù)據(jù)的個(gè)數(shù)該怎么辦呢?因?yàn)镈ataInputStream的讀入操作如遇到文件結(jié)尾就會(huì)拋出EOFException異常,所以我們可以將讀操作放入try塊中

11.2.4讀二進(jìn)制文件readInt方法可以從輸入流中讀入4個(gè)字節(jié)并將其當(dāng)作intpublic

static

void

main(String[]args)throwsIOException{FileInputStreams=new

FileInputStream("d:/Hello.txt");

intc;

while((c=s.read())!=-1)//讀取1字節(jié),結(jié)束返回-1

System.out.write(c);

s.close();}publicstaticvoidmain(String

public

static

voidmain(String[]args)throwsException{DataOutputStreamout=newDataOutputStream(

newFileOutputStream("D:/trytry.dat"));

out.writeByte(-1);

out.close();DataInputStreamin=newDataInputStream(

newFileInputStream("D:/trytry.dat"));

inta=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-1ff255publicstaticvoidmain(Strin用二進(jìn)制查看器打開D:/trytry.dat文件,其內(nèi)容為FF如果用readByte讀入,其高24位都將補(bǔ)1,所以結(jié)果還是-1如果用readUnsignedByte讀入,其高24位都將補(bǔ)0,結(jié)果就變成了255寫的字節(jié)是連續(xù)的,中間沒有分隔符,所以應(yīng)該記住寫的數(shù)據(jù)類型、個(gè)數(shù)等情況,以便將來利用

11.2.4讀二進(jìn)制文件用二進(jìn)制查看器打開D:/trytry.dat文件,其內(nèi)容為F11.2.5

處理壓縮文件壓縮流類java.util.zip包中提供了一些類,使我們可以以壓縮格式對流進(jìn)行讀寫它們都繼承自字節(jié)流類OutputStream和InputStream其中GZIPOutputStream和ZipOutputStream可分別把數(shù)據(jù)壓縮成GZIP格式和Zip格式GZIPInputStream和ZipInputStream可以分別把壓縮成GZIP格式或Zip的數(shù)據(jù)解壓縮恢復(fù)原狀11.2.5處理壓縮文件壓縮流類11.2.5

處理壓縮文件如果要從ZIP壓縮管理文件內(nèi)讀取某個(gè)文件,要先找到對應(yīng)該文件的”目錄進(jìn)入點(diǎn)”(從它可知該文件在Zip文件內(nèi)的位置),才能讀取這個(gè)文件的內(nèi)容。如果要將文件內(nèi)容寫到Zip文件內(nèi),必須先寫入對應(yīng)于該文件的”目錄進(jìn)入點(diǎn)”,并且把要寫入文件內(nèi)容的位置移到此進(jìn)入點(diǎn)所指的位置,然后再寫入文件內(nèi)容。ZipEntry類產(chǎn)生的對象,用來代表一個(gè)ZIP壓縮文件內(nèi)的進(jìn)入點(diǎn)(entry)。7711.2.5處理壓縮文件如果要從ZIP壓縮管理文件內(nèi)讀取11.2.5處理壓縮文件壓縮流的實(shí)現(xiàn)ZIP是一種較為常見的壓縮形式,在Java中要想實(shí)現(xiàn)ZIP的壓縮需要導(dǎo)入java.util.zip包,可以使用此包中的ZipOutputStream、ZipInputStream、ZipEntry幾個(gè)類完成。11.2.5處理壓縮文件壓縮流的實(shí)現(xiàn)11.2.5處理壓縮文件ZipEntry:在每一個(gè)壓縮文件中都會(huì)存在多個(gè)子文件,每一個(gè)子文件在JAVA中就使用ZipEntry表示。ZipEntry類的構(gòu)造方法:publicZipEntry(Stringname)在實(shí)例化ZipEntry的時(shí)候,要設(shè)置名稱,此名稱實(shí)際上就是壓縮文件中的每一個(gè)元素中的名稱。11.2.5處理壓縮文件ZipEntry:

public

static

voidmain(String[]args)throwsIOException{

FileInputStreamfi=newFileInputStream("D:/Hello.txt");FileOutputStreamfo=newFileOutputStream("D:/Hello.zip");ZipOutputStreamzo=newZipOutputStream(fo);System.out.println("compressingfromd:/Hello.txttod:/Hello.zip");ZipEntrye=newZipEntry("Hell.txt");zo.putNextEntry(e);

intc;

while((c=fi.read())!=-1)zo.write(c);fi.close();zo.close();}publicstaticvoidmain(Strin

public

static

voidmain(String[]args)throwsIOException{FileInputStreamzfi=newFileInputStream("D:/Hello.zip");ZipInputStreamzi=newZipInputStream(zfi);ZipFilezf=newZipFile("D:/Hello.zip");ZipEntryze=zi.getNextEntry();

ints;InputStreamis=zf.getInputStream(ze);

while((s=is.read())!=-1){System.out.print((char)s);}is.close();}publicstaticvoidmain(Strin運(yùn)行結(jié)果首先生成了壓縮文件“Hello.zip”,再讀取顯示其中的內(nèi)容,和“Hello.txt”中的內(nèi)容完全一樣,解壓縮文件“new.txt”,和“Hello.txt”中的內(nèi)容也完全相同說明read()方法讀取一個(gè)字節(jié),轉(zhuǎn)化為[0,255]的之間的一個(gè)整數(shù),返回一個(gè)int。如果讀到了文件末尾,則返回-1。write(int)方法寫一個(gè)字節(jié)的低8位,忽略了高24位。11.2.5

處理壓縮文件運(yùn)行結(jié)果11.2.5處理壓縮文件作業(yè)1.求出20個(gè)最小的素?cái)?shù)放在外存文件prime.txt中.2.編寫程序統(tǒng)計(jì)給定文件中每個(gè)字母出現(xiàn)的頻率。附加題:編寫程序,從給定文件中讀取一個(gè)整數(shù)序列,將其從小到大排序后再寫入另外一個(gè)文件中。作業(yè)1.求出20個(gè)最小的素?cái)?shù)放在外存文件prime.txt第11章輸入/輸出本章要點(diǎn)了解Java中流的概念了解Java中輸入輸出流的分類掌握文件輸入輸出流的使用方法掌握帶緩存的輸入輸出流的使用了解ZIP壓縮輸入輸出流的應(yīng)用第11章輸入/輸出本章要點(diǎn)了解Java中流的概念第11章輸入/輸出11.1輸入/輸出流11.2文件讀寫主要內(nèi)容第11章輸入/輸出11.1輸入/輸出流主要內(nèi)容11.1輸入/輸出流通常程序需要從外部獲取/輸出信息這個(gè)“外部”范圍很廣,包括諸如鍵盤、顯示器、文件、磁盤、網(wǎng)絡(luò)、另外一個(gè)程序等“信息”也可以是任何類型的,例如一個(gè)對象、字符串、圖像、聲音等通過使用java.io包中的輸入/輸出流類就可以達(dá)到輸入輸出信息的目的11.1輸入/輸出流通常程序需要從外部獲取/輸出信息Java所有的I/O機(jī)制都是基于數(shù)據(jù)流進(jìn)行輸入輸出,這些數(shù)據(jù)流表示了字符或者字節(jié)數(shù)據(jù)的流動(dòng)序列。Java的I/O流提供了讀寫數(shù)據(jù)的標(biāo)準(zhǔn)方法任何Java中表示數(shù)據(jù)源的對象都會(huì)提供以數(shù)據(jù)流的方式讀寫它的數(shù)據(jù)的方法。Java.io是大多數(shù)面向數(shù)據(jù)流的輸入/輸出類的主要軟件包。11.1輸入/輸出流Java所有的I/O機(jī)制都是基于數(shù)據(jù)流進(jìn)行輸入輸出,這些數(shù)據(jù)數(shù)據(jù)流是一串連續(xù)不斷的數(shù)據(jù)的集合。數(shù)據(jù)寫入程序可以是一段、一段地向數(shù)據(jù)流管道中寫入數(shù)據(jù),這些數(shù)據(jù)段會(huì)按先后順序形成一個(gè)長的數(shù)據(jù)流。對數(shù)據(jù)讀取程序來說,看不到數(shù)據(jù)流在寫入時(shí)的分段情況,每次可以讀取其中的任意長度的數(shù)據(jù),但只能先讀取前面的數(shù)據(jù)后,再讀取后面的數(shù)據(jù)。11.1輸入/輸出流數(shù)據(jù)流是一串連續(xù)不斷的數(shù)據(jù)的集合。11.1輸入/輸出流一組有序,有起點(diǎn)和終點(diǎn)的字節(jié)的數(shù)據(jù)序列。包括輸入流和輸出流。11.1輸入/輸出流一組有序,有起點(diǎn)和終點(diǎn)的字節(jié)的數(shù)據(jù)序列。11.1輸入/輸出11.1.1I/O流的概念在Java中將信息的輸入輸出過程抽象為I/O流輸入是指數(shù)據(jù)流入程序輸出是指數(shù)據(jù)從程序流出一個(gè)流就是一個(gè)從源流向目的地的數(shù)據(jù)序列IO流類一旦被創(chuàng)建就會(huì)自動(dòng)打開通過調(diào)用close方法,可以顯式關(guān)閉任何一個(gè)流,如果流對象不再被引用,Java的垃圾回收機(jī)制也會(huì)隱式地關(guān)閉它11.1.1I/O流的概念在Java中將信息的輸入輸出過11.1.1I/O流的概念輸入流為了從信息源獲取信息,程序打開一個(gè)輸入流,程序可從輸入流讀取信息11.1.1I/O流的概念輸入流11.1.1I/O流的概念輸出流當(dāng)程序需要向目標(biāo)位置寫信息時(shí),便需要打開一個(gè)輸出流,程序通過輸出流向這個(gè)目標(biāo)位置寫信息9211.1.1I/O流的概念輸出流9

對象源?/目標(biāo)?或兩者?diskfile

runningprogram

monitor

keyboard

Internetconnection

imagescanner

mouse

BothBothDestinationSourceBothSourceSource11.1.1I/O流的概念源和目標(biāo)的類型

對象源?/目標(biāo)?或兩者?diskfile

runni讀寫數(shù)據(jù)的方法不論數(shù)據(jù)從哪來,到哪去,也不論數(shù)據(jù)本身是何類型,讀寫數(shù)據(jù)的方法大體上都是一樣的讀寫打開一個(gè)流讀信息關(guān)閉流打開一個(gè)流寫信息關(guān)閉流11.1.1I/O流的概念讀寫數(shù)據(jù)的方法讀寫11.1.1I/O流的概念11.1.1I/O流的概念緩沖流:為流配備一個(gè)緩沖區(qū)(buffer)緩沖區(qū)就是一塊存儲區(qū)域,用來輔助與外部設(shè)備的數(shù)據(jù)傳輸,從而提高數(shù)據(jù)的傳輸效率在實(shí)現(xiàn)寫數(shù)據(jù)時(shí),先將這些數(shù)據(jù)寫入流緩沖區(qū),而并不直接將它們送入輸出設(shè)備,流緩沖區(qū)的數(shù)據(jù)量會(huì)被自動(dòng)地跟蹤,一旦發(fā)現(xiàn)緩沖區(qū)滿了,就會(huì)將其中的數(shù)據(jù)一次性傳輸?shù)酵獠吭O(shè)備上,緩沖區(qū)變?yōu)榭湛梢詼p少與外部設(shè)備打交道的次數(shù)11.1.1I/O流的概念緩沖流:為流配備一個(gè)緩沖區(qū)(bu11.1.2預(yù)定義的I/O流類概述從流的方向劃分輸入流輸出流從流的分工劃分節(jié)點(diǎn)流處理流從流的內(nèi)容劃分面向字符的流(字符流)面向字節(jié)的流(二進(jìn)制流)11.1.2預(yù)定義的I/O流類概述從流的方向劃分11.1.2預(yù)定義的I/O流類概述java.io包的頂級層次結(jié)構(gòu)面向字符的流:專門用于字符數(shù)據(jù)面向字節(jié)的流:用于一般目的

11.1.2預(yù)定義的I/O流類概述java.io包的頂級層1)面向字符的流面向字符的流針對字符數(shù)據(jù)的特點(diǎn)進(jìn)行過優(yōu)化,提供一些面向字符的有用特性源或目標(biāo)通常是文本文件1)面向字符的流面向字符的流面向字符的抽象類——Reader和Writerjava.io包中所有字符流的抽象基類Reader提供了輸入字符的APIWriter提供了輸出字符的API多數(shù)程序使用這兩個(gè)抽象類的一系列子類來讀入/寫出文本信息1)面向字符的流面向字符的抽象類——Reader和Writer1)面向字符陰影部分為節(jié)點(diǎn)流1)面向字符的流陰影部分為節(jié)點(diǎn)流1)面向字符的流數(shù)據(jù)源或目標(biāo)中含有非字符數(shù)據(jù),必須用字節(jié)流來輸入/輸出通常被用來讀寫諸如圖片、聲音之類的二進(jìn)制數(shù)據(jù)絕大多數(shù)數(shù)據(jù)是被存儲為二進(jìn)制文件的,世界上的文本文件大約只能占到2%,通常二進(jìn)制文件要比含有相同數(shù)據(jù)量的文本文件小得多2)面向字節(jié)的流數(shù)據(jù)源或目標(biāo)中含有非字符數(shù)據(jù),必須用字節(jié)流來輸入/輸出2)InputStream和OutputStream是用來處理8位字節(jié)流的抽象基類,程序使用這兩個(gè)類的子類來讀寫8位的字節(jié)信息分為兩部分節(jié)點(diǎn)流處理流2)面向字節(jié)的流InputStream和OutputStream2)面向字陰影部分為節(jié)點(diǎn)流2)面向字節(jié)的流陰影部分為節(jié)點(diǎn)流2)面向字節(jié)的流3)標(biāo)準(zhǔn)輸入輸出標(biāo)準(zhǔn)輸入輸出流對象,System類靜態(tài)成員變量System.in:InputStream類型的,代表標(biāo)準(zhǔn)輸入流,這個(gè)流是已經(jīng)打開了的,默認(rèn)狀態(tài)對應(yīng)于鍵盤輸入。System.out:PrintStream類型的,代表標(biāo)準(zhǔn)輸出流,默認(rèn)狀態(tài)對應(yīng)于屏幕輸出System.err:PrintStream類型的,代表標(biāo)準(zhǔn)錯(cuò)誤信息輸出流,默認(rèn)狀態(tài)對應(yīng)屏幕輸出3)標(biāo)準(zhǔn)輸入輸出標(biāo)準(zhǔn)輸入輸出流對象,System類靜態(tài)成員publicclassEcho{publicstaticvoidmain(String[]args)throwsIOException{

BufferedReaderin=newBufferedReader(newInputStreamReader(System.in));Strings;while((s=in.readLine()).length()!=0)System.out.println(s);}}運(yùn)行結(jié)果Hello!Hello!publicclassEcho{運(yùn)行結(jié)果System.in程序啟動(dòng)時(shí)由Java系統(tǒng)自動(dòng)創(chuàng)建的流對象,它是原始的字節(jié)流,不能直接從中讀取字符,需要對其進(jìn)行進(jìn)一步的處理InputStreamReader(System.in)以System.in為參數(shù)創(chuàng)建一個(gè)InputStreamReader流對象,相當(dāng)于字節(jié)流和字符流之間的一座橋梁,讀取字節(jié)并將其轉(zhuǎn)換為字符BufferedReaderin對InputStreamReader處理后的信息進(jìn)行緩沖,以提高效率System.in4)處理流不直接與數(shù)據(jù)源或目標(biāo)相連,而是基于另一個(gè)流來構(gòu)造從流讀寫數(shù)據(jù)的同時(shí)對數(shù)據(jù)進(jìn)行處理實(shí)例中的InputStreamReader和BufferedReader都屬于處理流InputStreamReader讀取字節(jié)并轉(zhuǎn)換為字符BufferedReader對另一個(gè)流產(chǎn)生的數(shù)據(jù)進(jìn)行緩沖4)處理流不直接與數(shù)據(jù)源或目標(biāo)相連,而是基于另一個(gè)流來構(gòu)造用一行表達(dá)式實(shí)現(xiàn):BufferedReaderstdin=newBufferedReader(newInputStreamReader(System.in));

4)處理流用一行表達(dá)式實(shí)現(xiàn):

5)I/O異常多數(shù)IO方法在遇到錯(cuò)誤時(shí)會(huì)拋出異常,因此調(diào)用這些方法時(shí)必須在方法頭聲明拋出IOException異常或者在try塊中執(zhí)行IO,然后捕獲IOException5)I/O異常多數(shù)IO方法在遇到錯(cuò)誤時(shí)會(huì)拋出異常,因此調(diào)用

11.1.3File類表示磁盤文件信息定義了一些與平臺無關(guān)的方法來操縱文件創(chuàng)建、刪除文件重命名文件判斷文件的讀寫權(quán)限及是否存在設(shè)置和查詢文件的最近修改時(shí)間等構(gòu)造文件流可以使用File類的對象作為參數(shù)11.1.3File類表示磁盤文件信息

11.1.3File類11.1.3File類

11.1.3File類11.1.3File類public

static

void

main(String[]args)throwsIOException{

Filef=newFile("D:"+File.separator+"Hello.txt");

if(f.exists())

f.delete();

else

try{

f.createNewFile();

}catch(Exceptione){System.out.println(e.getMessage());}}publicstaticvoidmain(String運(yùn)行結(jié)果因?yàn)樵诶?1_2中已經(jīng)創(chuàng)建了d:\Hello.txt,所以第一次運(yùn)行將刪除這個(gè)文件第二次運(yùn)行則又創(chuàng)建了一個(gè)此名的空文件分析在試圖打開文件之前,可以使用File類的isFile方法來確定File對象是否代表一個(gè)文件而非目錄)還可通過exists方法判斷同名文件或路徑是否存在,進(jìn)而采取正確的方法,以免造成誤操作114

11.1.3File類運(yùn)行結(jié)果3111.1.3File類11.2文件讀寫11.2.1寫文本文件11.2.2讀文本文件11.2.3寫二進(jìn)制文件11.2.4讀二進(jìn)制文件11.2.5處理壓縮文件11.2.6對象序列化11.2文件讀寫11.2.1寫文本文件11.2.1寫文本文件本節(jié)知識點(diǎn)FileWriter類創(chuàng)建一個(gè)磁盤文件關(guān)閉一個(gè)磁盤文件write()方法捕獲I/O異常BufferedWriter類11.2.1寫文本文件本節(jié)知識點(diǎn)1)FileWriter類(字符輸出流類)構(gòu)造方法FileWriterfw=newFileWriter(StringfileName);創(chuàng)建字符輸出流類對象和已存在的文件相關(guān)聯(lián)。文件不存在,則創(chuàng)建。FileWriterfw=newFileWriter(StringfileName,booleanappend);創(chuàng)建字符輸出流類對象和已存在的文件相關(guān)聯(lián),并設(shè)置該該流對文件的操作是否為續(xù)寫FileWriterfw=newFileWriter("C:\\demo.txt");FileWriterfw=newFileWriter("C:\\demo.txt",ture);1)FileWriter類(字符輸出流類)構(gòu)造方法File1)FileWriter類(字符輸出流類)主要方法voidwrite(Stringstr)

寫入字符串。viodflush()

刷新該流中的緩沖。viodclose()

關(guān)閉此流。1)FileWriter類(字符輸出流類)主要方法11.2.1寫文本文件【例】在C盤根目錄創(chuàng)建文本文件Hello.txt,并往里寫入若干行文本public

static

voidmain(String[]args)throwsIOException{

StringfileName="D:\\Hello.txt";

FileWriterwriter=newFileWriter(fileName);

writer.write("Hello!\n");

writer.write("Thisisafile\n");

writer.close();}11.2.1寫文本文件【例】在C盤根目錄創(chuàng)建文本文件Hel每次運(yùn)行這個(gè)程序,都將刪除已經(jīng)存在的”Hello.txt”文件,創(chuàng)建一個(gè)新的同名文件FileWriter的構(gòu)造方法有五個(gè),本例是通過一個(gè)字符串指定文件名來創(chuàng)建FileWriter類的write方法向文件中寫入字符close方法清空流里的內(nèi)容并關(guān)閉它。如果不調(diào)用該方法,可能系統(tǒng)還沒有完成所有數(shù)據(jù)的寫操作,程序就結(jié)束了11.2.1寫文本文件--實(shí)例說明每次運(yùn)行這個(gè)程序,都將刪除已經(jīng)存在的”Hello.txt”文Writer類的流可實(shí)現(xiàn)內(nèi)部格式到外部磁盤文件格式的轉(zhuǎn)換“Hello.txt”是一個(gè)普通的ASCII碼文本文件,英文字符占一個(gè)字節(jié),中文字符占兩個(gè)字節(jié)Java程序中的字符串則是每個(gè)字符占兩個(gè)字節(jié)的,采用Unicode編碼11.2.1寫文本文件--實(shí)例說明Writer類的流可實(shí)現(xiàn)內(nèi)部格式到外部磁盤文件格式的轉(zhuǎn)換11public

static

voidmain(String[]args){StringfileName="D:\\Hello.txt";

try{

//將所有IO操作放入try塊中

FileWriterwriter=newFileWriter(fileName,true);writer.write("Hello!\n");writer.write("Thisisatextfile\n");

writer.close();

}catch(IOExceptioniox){

System.out.println("Problemwriting"+fileName);

}}publicstaticvoidmain(Stri運(yùn)行此程序,會(huì)發(fā)現(xiàn)在原文件內(nèi)容后面又追加了重復(fù)的內(nèi)容,這就是將構(gòu)造方法的第二個(gè)參數(shù)設(shè)為true的效果如果將文件屬性改為只讀屬性,再運(yùn)行本程序,就會(huì)出現(xiàn)IO錯(cuò)誤,程序?qū)⑥D(zhuǎn)入catch塊中,給出出錯(cuò)信息12311.2.1寫文本文件運(yùn)行此程序,會(huì)發(fā)現(xiàn)在原文件內(nèi)容后面又追加了重復(fù)的內(nèi)容,這就是如果需要寫入的內(nèi)容很多,就應(yīng)該使用更為高效的緩沖器流類BufferedWriterFileWriter和BufferedWriter類都用于輸出字符流,包含的方法幾乎完全一樣,但BufferedWriter多提供了一個(gè)newLine()方法用于換行不同廠家生產(chǎn)的計(jì)算機(jī)(IBM,Apple,VAX,Sun)對文字的換行方法不同。newLine()方法可以輸出在當(dāng)前計(jì)算機(jī)上正確的換行符2)BufferedWriter類如果需要寫入的內(nèi)容很多,就應(yīng)該使用更為高效的緩沖器流類Bufpublic

static

voidmain(String[]args)throwsIOException{StringfileName="D:\\newHello.txt";

BufferedWriterout

=newBufferedWriter(

newFileWriter(fileName

));out.write("Hello!");out.newLine();out.write("ThisisanotherFile");out.close();}publicstaticvoidmain(Stri11.2.2讀文本文件本節(jié)知識點(diǎn)ReaderFileReaderBufferedReader和readLine()12611.2.2讀文本文件本節(jié)知識點(diǎn)43FileReader類從文本文件中讀取字符繼承自Reader抽象類的子類InputStreamReaderBufferedReader讀文本文件的緩沖器類具有readLine()方法,可以對換行符進(jìn)行鑒別,一行一行地讀取輸入流中的內(nèi)容繼承自Reader11.2.2讀文本文件FileReader類11.2.2讀文本文件文件輸入方法:BufferedReaderin=newBufferedReader(new

FileReader(fileName));

11.2.2讀文本文件文件輸入方法:

public

static

voidmain(String[]args){StringfileName="D:\\Hello.txt";Stringline;

try{

BufferedReaderin=newBufferedReader(

newFileReader(fileName));

line=in.readLine();

while(line!=null){System.out.println(line);line=in.readLine();}in.close();

}catch(IOExceptioniox){System.out.println("Problem"+fileName);}}publicstaticvoidmain(StrinFileReader對象創(chuàng)建后將打開文件,如果文件不存在,會(huì)拋出一個(gè)IOExceptionclose()方法為了操作系統(tǒng)可以更為有效地利用有限的資源,應(yīng)該在讀取完畢后,調(diào)用該方法11.2.2讀文本文件FileReader對象11.2.2讀文本文件BufferedReader類的read

溫馨提示

  • 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)僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論