Java程序設(shè)計(jì)-Java-08-輸入輸出_第1頁
Java程序設(shè)計(jì)-Java-08-輸入輸出_第2頁
Java程序設(shè)計(jì)-Java-08-輸入輸出_第3頁
Java程序設(shè)計(jì)-Java-08-輸入輸出_第4頁
Java程序設(shè)計(jì)-Java-08-輸入輸出_第5頁
已閱讀5頁,還剩87頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第六章輸入/輸出流和文件6.1輸入/輸出流6.2文件讀寫1精選2021版課件6.1輸入/輸出流通常程序需要從外部獲取/輸出信息這個(gè)“外部”范圍很廣,包括諸如鍵盤、顯示器、文件、磁盤、網(wǎng)絡(luò)、另外一個(gè)程序等“信息”也可以是任何類型的,例如一個(gè)對(duì)象、串字符、圖像、聲音等通過使用java.io包中的輸入/輸出流類就可以達(dá)到輸入輸出信息的目的2精選2021版課件6.1.1I/O流的概念流:數(shù)據(jù)從計(jì)算機(jī)的輸入向輸出流動(dòng),即流的產(chǎn)生。流有兩種:文本流(字符)和二進(jìn)制流(字節(jié))在Java里,流是一些類。在Java中將信息的輸入與輸出過程抽象為I/O流輸入是指數(shù)據(jù)流入程序輸出是指數(shù)據(jù)從程序流出一個(gè)流就是一個(gè)從源流向目的地的數(shù)據(jù)序列3精選2021版課件6.1.1I/O流的概念文件File也是一個(gè)邏輯概念。計(jì)算機(jī)的所有設(shè)備都可理解為一個(gè)文件。流可與文件建立聯(lián)系。java.lang.Object java.io.File java.io.RandomAccessFile java.io.InputStream java.io.OutputStream java.io.Reader java.io.Writer IO流類一旦被創(chuàng)建就會(huì)自動(dòng)打開通過調(diào)用close方法,可以顯式關(guān)閉任何一個(gè)流;如果流對(duì)象不再被引用,Java的垃圾回收機(jī)制也會(huì)隱式地關(guān)閉它4精選2021版課件6.1.1I/O流的概念輸入流為了從信息源獲取信息,程序打開一個(gè)輸入流,程序可從輸入流讀取信息輸出流當(dāng)程序需要向目標(biāo)位置寫信息時(shí),便需要打開一個(gè)輸出流,程序通過輸出流向這個(gè)目標(biāo)位置寫信息5精選2021版課件6.1.1I/O流的概念源和目標(biāo)的類型對(duì)象源?目標(biāo)?或兩者?diskfile

runningprogram

monitor

keyboard

Internetconnection

imagescanner

mouse

BothBothDestinationSourceBothSourceSource6精選2021版課件6.1.1I/O流的概念讀寫數(shù)據(jù)的方法不論數(shù)據(jù)從哪來,到哪去,也不論數(shù)據(jù)本身是何類型,讀寫數(shù)據(jù)的方法大體上都是一樣的:打開一個(gè)流,讀/寫信息,關(guān)閉流。7精選2021版課件6.1.2預(yù)定義的I/O流類概述輸入/輸出流可以從以下幾個(gè)方面進(jìn)行分類從流的方向劃分輸入流輸出流從流的分工劃分節(jié)點(diǎn)流處理流從流的內(nèi)容劃分面向字符的流面向字節(jié)的流8精選2021版課件6.1.2預(yù)定義的I/O流類概述java.io包的頂級(jí)層次結(jié)構(gòu)面向字符的流:專門用于字符數(shù)據(jù)面向字節(jié)的流:用于一般目的

9精選2021版課件6.1.2預(yù)定義的I/O流類概述面向字符的流針對(duì)字符數(shù)據(jù)的特點(diǎn)進(jìn)行過優(yōu)化,提供一些面向字符的有用特性源或目標(biāo)通常是文本文件實(shí)現(xiàn)內(nèi)部格式和文本文件中的外部格式之間轉(zhuǎn)換內(nèi)部格式:16-bitchar數(shù)據(jù)類型外部格式:UTF(UniversalcharactersetTransformationFormat):很多人稱之為"UniversalTextFormat"包括ASCII碼及非ASCII碼字符,比如:斯拉夫(Cyrillic)字符,希臘字符,亞洲字符等10精選2021版課件6.1.2預(yù)定義的I/O流類概述面向字符的抽象類——Reader和Writerjava.io包中所有字符流的抽象基類Reader提供了輸入字符的APIWriter提供了輸出字符的API它們的子類又可分為兩大類節(jié)點(diǎn)流:從數(shù)據(jù)源讀入數(shù)據(jù)或往目的地寫出數(shù)據(jù)處理流:對(duì)數(shù)據(jù)執(zhí)行某種處理多數(shù)程序使用這兩個(gè)抽象類的一系列子類來讀入/寫出文本信息例如FileReader/FileWriter用來讀/寫文本文件11精選2021版課件陰影部分為節(jié)點(diǎn)流12精選2021版課件6.1.2預(yù)定義的I/O流類概述面向字節(jié)的流數(shù)據(jù)源或目標(biāo)中含有非字符數(shù)據(jù),必須用字節(jié)流來輸入/輸出通常被用來讀寫諸如圖片、聲音之類的二進(jìn)制數(shù)據(jù)絕大多數(shù)數(shù)據(jù)是被存儲(chǔ)為二進(jìn)制文件的,世界上的文本文件大約只能占到2%,通常二進(jìn)制文件要比含有相同數(shù)據(jù)量的文本文件小得多。13精選2021版課件6.1.2預(yù)定義的I/O流類概述面向字節(jié)的流InputStream和OutputStream是用來處理8位字節(jié)流的抽象基類,程序使用這兩個(gè)類的子類來讀寫8位的字節(jié)信息分為兩部分節(jié)點(diǎn)流處理流14精選2021版課件6.1.2預(yù)定義的I/O流類概述面向字節(jié)的流陰影部分為節(jié)點(diǎn)流15精選2021版課件6.1.2預(yù)定義的I/O流類概述標(biāo)準(zhǔn)輸入輸出標(biāo)準(zhǔn)輸入輸出流屬于System類。System類實(shí)現(xiàn)了用戶使用資源時(shí)的系統(tǒng)無關(guān)編程接口;是final類;所有變量和方法都是static的;不用初始化(new)就可以使用System類的靜態(tài)成員變量System.in:InputStream類型的,代表標(biāo)準(zhǔn)輸入流,這個(gè)流是已經(jīng)打開了的,默認(rèn)狀態(tài)對(duì)應(yīng)于鍵盤輸入。System.out:PrintStream類型的,代表標(biāo)準(zhǔn)輸出流,默認(rèn)狀態(tài)對(duì)應(yīng)于屏幕輸出System.err:PrintStream類型的,代表標(biāo)準(zhǔn)錯(cuò)誤信息輸出流,默認(rèn)狀態(tài)對(duì)應(yīng)于屏幕輸出16精選2021版課件6.1.2預(yù)定義的I/O流類概述標(biāo)準(zhǔn)輸入輸出System.inpublicfinalstaticInputStreamin=newInputStream(); read(),read(byteb[],intoff,intlen),read(byteb[])System.outpublicfinalstaticPrintStreamout=newPrintStream();print(),println(),write()System.errpublicfinalstaticPrintStreamerr=newPrintStream();print(),println(),write()17精選2021版課件6.1.2預(yù)定義的I/O流類概述從鍵盤讀入信息并在顯示器上顯示importjava.io.*;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!18精選2021版課件6.1.2預(yù)定義的I/O流類概述System.in程序啟動(dòng)時(shí)由Java系統(tǒng)自動(dòng)創(chuàng)建的流對(duì)象,它是原始的字節(jié)流,不能直接從中讀取字符,需要對(duì)其進(jìn)行進(jìn)一步的處理InputStreamReader(System.in)以System.in為參數(shù)創(chuàng)建一個(gè)InputStreamReader流對(duì)象,相當(dāng)于字節(jié)流和字符流之間的一座橋梁,讀取字節(jié)并將其轉(zhuǎn)換為字符BufferedReaderin對(duì)InputStreamReader處理后的信息進(jìn)行緩沖,以提高效率19精選2021版課件6.1.2預(yù)定義的I/O流類概述一個(gè)方便的掃描API:把文本轉(zhuǎn)化成基本類型或者StringScanners=newScanner(System.in);intn=s.nextInt();還有下列方法:

nextByte(),nextDouble(),nextFloat,nextInt(),nextLine(),nextLong(),nextShort()20精選2021版課件6.1.2預(yù)定義的I/O流類概述處理流不直接與數(shù)據(jù)源或目標(biāo)相連,而是基于另一個(gè)流來構(gòu)造從流讀寫數(shù)據(jù)的同時(shí)對(duì)數(shù)據(jù)進(jìn)行處理InputStreamReader和BufferedReader都屬于處理流InputStreamReader讀取字節(jié)并轉(zhuǎn)換為字符BufferedReader對(duì)另一個(gè)流產(chǎn)生的數(shù)據(jù)進(jìn)行緩沖用一行表達(dá)式實(shí)現(xiàn):BufferedReaderstdin=newBufferedReader

(newnputStreamReader(System.in));

21精選2021版課件6.1.2預(yù)定義的I/O流類概述I/O異常多數(shù)IO方法在遇到錯(cuò)誤時(shí)會(huì)拋出異常,因此調(diào)用這些方法時(shí)必須在方法頭聲明拋出IOException異?;蛘咴趖ry塊中執(zhí)行IO,然后捕獲IOException22精選2021版課件第六章輸入/輸出流和文件6.1輸入/輸出流6.2文件讀寫寫文本文件讀文本文件寫二進(jìn)制文件讀二進(jìn)制文件File類對(duì)象序列化隨機(jī)文件讀寫23精選2021版課件6.2.1寫文本文件FileWriter類創(chuàng)建一個(gè)磁盤文件關(guān)閉一個(gè)磁盤文件write()方法捕獲I/O異常BufferedWriter類24精選2021版課件6.2.1寫文本文件在C盤根目錄創(chuàng)建文本文件Hello.txt,并往里寫入若干行文本importjava.io.*;classWriteTxtFile{publicstaticvoidmain(String[]args)throwsIOException{//main方法中聲明拋出IO異常

StringfileName=“C:\Hello.txt";

FileWriter

writer=newFileWriter(fileName);

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

writer.write("Youcanseehowthisisdone.\n");

writer.write("輸入一行中文也可以\n");

writer.close();}}25精選2021版課件6.2.1寫文本文件打開C盤根目錄下的Hello.txt文件每次運(yùn)行這個(gè)程序,都將刪除已經(jīng)存在的”Hello.txt”文件,創(chuàng)建一個(gè)新的同名文件FileWriter的構(gòu)造方法有五個(gè),本例是通過一個(gè)字符串指定文件名來創(chuàng)建FileWriter類的write方法向文件中寫入字符換行有些問題26精選2021版課件6.2.1寫文本文件上例WriteTxtFile說明Writer類的流可實(shí)現(xiàn)內(nèi)部格式到外部磁盤文件格式轉(zhuǎn)換“Hello.txt”是一個(gè)普通的ASCII碼文本文件,每個(gè)英文字符占一個(gè)字節(jié),中文字符占兩個(gè)字節(jié)Java程序中的字符串則是每個(gè)字符占兩個(gè)字節(jié)的,采用Unicode編碼close方法清空流里的內(nèi)容并關(guān)閉它。如果不調(diào)用該方法,可能系統(tǒng)還沒有完成所有數(shù)據(jù)的寫操作,程序就結(jié)束了27精選2021版課件6.2.1寫文本文件處理IO異常importjava.io.*;classWriteTxtFile2{publicstaticvoidmain(String[]args){StringfileName="c:\\Hello.txt";

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

FileWriterwriter=newFileWriter(fileName,true); writer.write("Hello!\n"); writer.write("Thisismyfirsttextfile,\n"); writer.write("Youcanseehowthisisdone.\n");writer.write("輸入一行中文也可以\n"); writer.close();}catch(IOExceptioniox){System.out.println("Problemwriting"+fileName);}}}28精選2021版課件6.2.1寫文本文件運(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ò)信息29精選2021版課件6.2.1寫文本文件BufferedWriter類如果需要寫入的內(nèi)容很多,就應(yīng)該使用更為高效的緩沖器流類BufferedWriterFileWriter和BufferedWriter類都用于輸出字符流,包含的方法幾乎完全一樣,但BufferedWriter多提供了一個(gè)newLine()方法用于換行不同廠家生產(chǎn)的計(jì)算機(jī)(IBM,Apple,VAX,Sun)對(duì)文字的換行方法不同。newLine()方法可以輸出在當(dāng)前計(jì)算機(jī)上正確的換行符30精選2021版課件6.2.1寫文本文件使用BufferedWriter完成例WriteTxtFile實(shí)現(xiàn)的功能importjava.io.*;//BufferedWriterclassBufferWriterEx{ publicstaticvoidmain(String[]args)throwsIOException{ StringfileName="C:\newHello.txt";

BufferedWriterout=newBufferedWriter(newFileWriter(fileName));out.write("Hello!");

out.newLine(); out.write("ThisisanothertextfileusingBufferedWriter,");

out.newLine();out.write("SoIcanuseacommonwaytostartanewline");out.close();}}31精選2021版課件6.2.1寫文本文件用任何文本編輯器打開newHello.txt都會(huì)出現(xiàn)正確的換行效果32精選2021版課件第六章輸入/輸出流和文件6.1輸入/輸出流6.2文件讀寫寫文本文件讀文本文件寫二進(jìn)制文件讀二進(jìn)制文件File類對(duì)象序列化隨機(jī)文件讀寫33精選2021版課件6.2.2讀文本文件本節(jié)知識(shí)點(diǎn)ReaderFileReaderBufferedReader和readLine文本文件復(fù)制34精選2021版課件6.2.2讀文本文件FileReader類從文本文件中讀取字符繼承自Reader抽象類的子類InputStreamReaderBufferedReader類讀文本文件的緩沖器類具有readLine()方法,可以對(duì)換行符進(jìn)行鑒別,一行一行地讀取輸入流中的內(nèi)容繼承自Reader文件輸入方法:BufferedReaderin

=newBufferedReader(new

FileReader(fileName));

35精選2021版課件6.2.2讀文本文件從Hello.txt中讀取文本并顯示在屏幕上importjava.io.*;classReadTxtFile{publicstaticvoidmain(String[]args){StringfileName="C:\Hello.txt";try{BufferedReaderin=newBufferedReader(newFileReader(fileName));line=in.readLine();//讀取一行內(nèi)容

while(line!=null){ System.out.println(line); line=in.readLine(); }in.close();}catch(IOExceptioniox){System.out.println("Problemreading"+fileName);}}}36精選2021版課件6.2.2讀文本文件說明運(yùn)行該程序,屏幕上將逐行顯示出Hello.txt文件中的內(nèi)容FileReader對(duì)象:創(chuàng)建后將打開文件,如果文件不存在,會(huì)拋出一個(gè)IOExceptionBufferedReader類的readLine()方法:從一個(gè)面向字符的輸入流中讀取一行文本。如果其中不再有數(shù)據(jù),返回nullReader類的read()方法:也可用來判別文件結(jié)束。該方法返回的一個(gè)表示某個(gè)字符的int型整數(shù),如果讀到文件末尾,返回-1。據(jù)此,可修改本例中的讀文件部分:

intc;while((c=in.read())!=-1)System.out.print((char)c);close()方法:為了操作系統(tǒng)可以更為有效地利用有限的資源,應(yīng)該在讀取完畢后,調(diào)用該方法37精選2021版課件6.2.2讀文本文件指定源文件和目標(biāo)文件名,將源文件的內(nèi)容拷貝至目標(biāo)文件。調(diào)用方式為:javacopysourceFiledestinationFile38精選2021版課件6.2.2讀文本文件例子javaCopyFileExsourcefiledestinationfile共包括兩個(gè)類CopyMakerprivatebooleanopenFiles()privatebooleancopyFiles()privatebooleancloseFiles()publicboolean

copy(Stringsrc,Stringdst)CopyFileExmain()

39精選2021版課件6.2.2讀文本文件例子importjava.io.*;classCopyMaker{StringsourceName,destName;BufferedReadersource;BufferedWriterdest;Stringline;40精選2021版課件privatebooleanopenFiles(){try{ source=newBufferedReader(newFileReader(sourceName));}catch(IOExceptioniox){ System.out.println("Problemopening"+sourceName);returnfalse;}try{ dest=newBufferedWriter(newFileWriter(destName));}catch(IOExceptioniox){ System.out.println("Problemopening"+destName);returnfalse;}returntrue;}41精選2021版課件privatebooleancopyFiles(){try{ line=source.readLine();while(line!=null){dest.write(line);dest.newLine();

line=source.readLine();}}catch(IOExceptioniox){ System.out.println("Problemreadingorwriting");returnfalse;}returntrue;}42精選2021版課件privatebooleancloseFiles(){booleanretVal=true;try{source.close();}catch(IOExceptioniox){ System.out.println("Problemclosing"+sourceName);retVal=false;}try{dest.close();}catch(IOExceptioniox){ System.out.println("Problemclosing"+destName);retVal=false;}returnretVal;}publicbooleancopy(Stringsrc,Stringdst){sourceName=src;destName=dst;returnopenFiles()&©Files()&&closeFiles();}}43精選2021版課件publicclassCopyFileEx//一個(gè)文件中只能有一個(gè)公有類{publicstaticvoidmain(String[]args){ if(args.length==2)newCopyMaker().copy(args[0],args[1]);elseSystem.out.println("PleaseEnterFilenames");}}此文件CopyFileEx.java編譯后生成CopyFileEx.class和CopyMaker.class兩個(gè)字節(jié)碼文件運(yùn)行結(jié)果在命令行方式下執(zhí)行如下命令javaCopyFileExc:\Hello.txtc:\CopyHello.txt則在C盤根目錄下會(huì)出現(xiàn)CopyHello.txt文件,內(nèi)容與Hello.txt完全相同44精選2021版課件第六章輸入/輸出流和文件6.1輸入/輸出流6.2文件讀寫寫文本文件讀文本文件寫二進(jìn)制文件讀二進(jìn)制文件File類對(duì)象序列化隨機(jī)文件讀寫45精選2021版課件

6.2.3寫二進(jìn)制文件本節(jié)知識(shí)點(diǎn)二進(jìn)制文件OutputStreamFileOutputStreamBufferedOutputStreamDataOutputStreamwriteInt()writeDouble()writeBytes()46精選2021版課件6.2.3寫二進(jìn)制文件二進(jìn)制文件原則上講,所有文件都是由8位的字節(jié)組成的如果文件字節(jié)中的內(nèi)容應(yīng)被解釋為字符,則文件被稱為文本文件;如果被解釋為其它含義,則文件被稱為二進(jìn)制文件例如文字處理程序,例如字處理軟件Word產(chǎn)生的doc文件中,數(shù)據(jù)要被解釋為字體、格式、圖形和其他非字符信息。因此,這樣的文件是二進(jìn)制文件,不能用Reader流正確讀取。為什么需要二進(jìn)制文件輸入輸出更快比文本文件小很多有些數(shù)據(jù)不容易被表示為字符47精選2021版課件6.2.3寫二進(jìn)制文件抽象類OutputStream派生類FileOutputStream用于一般目的輸出(非字符輸出)用于成組字節(jié)輸出派生類DataOutputStream具有寫各種基本數(shù)據(jù)類型的方法將數(shù)據(jù)寫到另一個(gè)輸出流它在所有的計(jì)算機(jī)平臺(tái)上使用同樣的數(shù)據(jù)格式其中size方法,可作為計(jì)數(shù)器,統(tǒng)計(jì)寫入的字節(jié)數(shù)48精選2021版課件6.2.3寫二進(jìn)制文件將三個(gè)int型數(shù)字255/0/-1寫入數(shù)據(jù)文件data1.datimportjava.io.*;classWriteByteFileEx{publicstaticvoidmain(String[]args){StringfileName="c:/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"+fileName);}}}49精選2021版課件6.2.3寫二進(jìn)制文件運(yùn)行結(jié)果運(yùn)行程序后,在C盤生成數(shù)據(jù)文件data1.dat用寫字板打開沒有任何顯示用UltraEdit打開查看其二進(jìn)制信息,

內(nèi)容為000000FF00000000FFFFFFFF,

每個(gè)int數(shù)字都是32個(gè)bit的說明FileOutputStream類的構(gòu)造方法負(fù)責(zé)打開文件“data1.dat”用于寫數(shù)據(jù)FileOutputStream類的對(duì)象與DataOutputStream對(duì)象連接,寫基本類型的數(shù)據(jù)50精選2021版課件6.2.3寫二進(jìn)制文件BufferedOutputStream類寫二進(jìn)制文件的緩沖流類類似于文本文件中的BufferedWriter對(duì)于大量數(shù)據(jù)的寫入,可提高效率用法示例:DataOutputStreamout=new

DataOutputStream(newBufferedOutputStream(newFileOutputStream(fileName)));51精選2021版課件向文件中寫入各種數(shù)據(jù)類型的數(shù),并統(tǒng)計(jì)寫入的字節(jié)數(shù)importjava.io.*;classWriteByteFileEx2{publicstaticvoidmain(String[]args)throwsIOException{ StringfileName="mixedTypes.dat";

DataOutputStream

dataOut

=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.close();}}6.2.3寫二進(jìn)制文件52精選2021版課件6.2.3寫二進(jìn)制文件運(yùn)行結(jié)果4byteshavebeenwritten12byteshavebeenwritten16byteshavebeenwritten說明這個(gè)程序可作為字節(jié)計(jì)數(shù)器53精選2021版課件第六章輸入/輸出流和文件6.1輸入/輸出流6.2文件讀寫寫文本文件讀文本文件寫二進(jìn)制文件讀二進(jìn)制文件File類對(duì)象序列化隨機(jī)文件讀寫54精選2021版課件6.2.4讀二進(jìn)制文件本節(jié)知識(shí)點(diǎn)FileInputStreamDataInputStreamBufferedInputSteam讀寫整數(shù)讀寫單字節(jié)55精選2021版課件6.2.4讀二進(jìn)制文件過濾流讀或?qū)懙耐瑫r(shí)對(duì)數(shù)據(jù)進(jìn)行處理通過另外一個(gè)流來構(gòu)造一個(gè)過濾流大部分java.io包所提供過濾流都是FilterInputStream和FilterOutputStream的子類DataInputStream和DataOutputStreamBufferedInputStream和BufferedOutputStreamLineNumberInputStreamPushbackInputStreamPrintStream56精選2021版課件6.2.4讀二進(jìn)制文件讀取例WriteByteFileEx類創(chuàng)建的數(shù)據(jù)文件中的3個(gè)int型數(shù)字,顯示相加結(jié)果importjava.io.*;classReadByteFileEx{publicstaticvoidmain(String[]args){ StringfileName="c:/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);}}}57精選2021版課件6.2.4讀二進(jìn)制文件該程序顯示結(jié)果是254分析readInt方法可以從輸入流中讀入4個(gè)字節(jié)并將其當(dāng)作int型數(shù)據(jù)由于知道文件中存儲(chǔ)的是3個(gè)int型數(shù)據(jù),所以使用了3個(gè)讀入語句如果不知道數(shù)據(jù)的個(gè)數(shù)該怎么辦呢?因?yàn)镈ataInputStream的讀入操作如遇到文件結(jié)尾就會(huì)拋出EOFException異常,所以我們可以將讀操作放入try塊中。58精選2021版課件6.2.4讀二進(jìn)制文件修改ReadByteFileEx類將讀操作放入try塊中,使遇到文件結(jié)尾就會(huì)拋出EOFException異常,進(jìn)入到相應(yīng)的catch塊中try{while(true)sum+=instr.readInt();}catch(EOFExceptioneof){System.out.println("Thesumis:"+sum);instr.close();}59精選2021版課件6.2.4讀二進(jìn)制文件繼續(xù)修改ReadByteFileEx類如果沒有讀到結(jié)尾,在讀取過程中發(fā)生的異常屬于IOException,這樣就需要我們?cè)偌右粋€(gè)catch塊處理這種異常一個(gè)try塊后面可以跟不止一個(gè)catch塊,用于處理各種可能發(fā)生的異常我們可以在上段代碼后再加上用于捕捉IOException的代碼段如下catch(IOExceptioneof){System.out.println("Problemreadinginput");instr.close();}60精選2021版課件6.2.4讀二進(jìn)制文件如果catch塊中的close方法也發(fā)生異常,現(xiàn)在就沒法捕獲了。解決方法可以有在main方法中拋出異常比較簡(jiǎn)單缺點(diǎn)是沒有catch塊,因而無法對(duì)異常進(jìn)行進(jìn)一步處理,例如給出提示信息使用嵌套的try塊61精選2021版課件importjava.io.*;classReadByteFileEx2{publicstaticvoidmain(String[]args){StringfileName="c:\\data1.dat";longsum=0;try{ DataInputStreaminstr=newDataInputStream(newBufferedInputStream(newFileInputStream(fileName)));

try{while(true)sum+=instr.readInt();}catch(EOFExceptioneof){System.out.println("Thesumis:"+sum);instr.close();}}catch(IOExceptioniox){System.out.println("IOProblemswith"+fileName);}}}}62精選2021版課件6.2.4讀二進(jìn)制文件讀寫字節(jié)DataOutputStream的writeByte方法publicfinalvoidwriteByte(intb)throwsIOException將int的最不重要字節(jié)寫入輸出流DataInputStream的readUnsignedByte方法publicfinalintreadUnsignedByte()throwsIOException從輸入流中讀取1字節(jié)存入int的最不重要字節(jié)63精選2021版課件6.2.4讀二進(jìn)制文件從命令行輸入源文件名和目標(biāo)文件名,將源文件復(fù)制為目標(biāo)文件。importjava.io.*;classCopyBytes{publicstaticvoidmain(String[]args){

DataInputStream

instr;

DataOutputStream

outstr;if(args.length!=2){System.out.println("Pleaseenterfilenames");return;}try{

instr=newDataInputStream(newBufferedInputStream(newFileInputStream(args[0])));

outstr=newDataOutputStream(newBufferedOutputStream(newFileOutputStream(args[1])));64精選2021版課件try{intdata;while(true){data=instr.readUnsignedByte();

outstr.writeByte(data);}}catch(EOFExceptioneof){outstr.close();instr.close();return;}}catch(FileNotFoundExceptionnfx){System.out.println("Problemopeningfiles");}catch(IOExceptioniox){System.out.println("IOProblems");}}}65精選2021版課件第六章輸入/輸出流和文件6.1輸入/輸出流6.2文件讀寫寫文本文件讀文本文件寫二進(jìn)制文件讀二進(jìn)制文件File類對(duì)象序列化隨機(jī)文件讀寫66精選2021版課件6.2.5

File類表示磁盤文件信息定義了一些與平臺(tái)無關(guān)的方法來操縱文件創(chuàng)建、刪除文件重命名文件判斷文件的讀寫權(quán)限及是否存在設(shè)置和查詢文件的最近修改時(shí)間等構(gòu)造文件流可以使用File類的對(duì)象作為參數(shù)67精選2021版課件java.io.File+File(pathname:String)根據(jù)pathname創(chuàng)建File對(duì)象。pathname可以是文件或目錄+File(parent:String,child:String)在parent這個(gè)目錄下,創(chuàng)建File對(duì)象,child可以使文件或目錄+File(parent:File,child:String)同上,只是parent是一個(gè)File對(duì)象+exists():boolean文件或目錄是否存在+canRead():boolean是否可讀+canWrite():boolean是否可寫+isDirectory():boolean是否為目錄+isFile():boolean是否為文件+isAbsolute():boolean本File對(duì)象是否采用絕對(duì)路徑來創(chuàng)建的+isHidden():boolean是否為隱藏文件+getAbsolutePath():String得到絕對(duì)路徑+getCanonicalPath():String得到規(guī)范的絕對(duì)路徑+getName():String得到文件/目錄名+getPath():String得到路徑+getParent():String得到父目錄的路徑名+lastModified():long最后修改時(shí)間+delete():boolean刪除+renameTo(dest:File):boolean重命名68精選2021版課件6.2.5

File類publicclassFileTest{

publicstaticviodmain(String[]args){java.io.Filefile=newjava.io.File(“image\up.gif");System.out.println("Doesitexist?"+file.exists());System.out.println("Canitberead?"+file.canRead());System.out.println("Canitbewritten?"+file.canWrite());System.out.println("Isitadirectory?"+file.isDirectory());System.out.println("Isitafile?"+file.isFile());System.out.println("Isitabsolute?"+file.isAbsolute());System.out.println("Isithidden?"+file.isHidden());System.out.println("Absolutepathis"+file.getAbsolutePath());System.out.println("Lastmodifiedon"+newjava.util.Date(file.lastModified()));}}Doesitexist?trueCanitberead?trueCanitbewritten?trueIsitadirectory?falseIsitafile?trueIsitabsolute?falseIsithidden?falseAbsolutepathisE:\FreePP\Android\project\java-test\image\up.gifLastmodifiedonThuAug0616:41:51CST201269精選2021版課件6.2.5

File類在C盤創(chuàng)建文件Hello.txt,如果存在,則刪除舊文件,不存在則直接創(chuàng)建新的importjava.io.*;publicclassFileEx{publicstaticvoidmain(String[]args){Filef=newFile("c:"+File.separator+"Hello.txt"); if(f.exists())f.delete();else try{ f.createNewFile(); } catch(Exceptione){ System.out.println(e.getMessage());}}}70精選2021版課件6.2.5

File類運(yùn)行結(jié)果因?yàn)樵谇袄幸呀?jīng)創(chuàng)建了c:\Hello.txt,所以第一次運(yùn)行將刪除這個(gè)文件第二次運(yùn)行則又創(chuàng)建了一個(gè)此名的空文件分析在試圖打開文件之前,可以使用File類的isFile方法來確定File對(duì)象是否代表一個(gè)文件而非目錄)還可通過exists方法判斷同名文件或路徑是否存在,進(jìn)而采取正確的方法,以免造成誤操作71精選2021版課件6.2.5

File類--改進(jìn)的文件復(fù)制程序importjava.io.*;classNewCopyBytes{publicstaticvoidmain(String[]args){DataInputStreaminstr;DataOutputStreamoutstr;if(args.length!=2){System.out.println("PleaseEnterfilenames!");return;}FileinFile=newFile(args[0]);FileoutFile=newFile(args[1]);if(outFile.exists()){System.out.println(args[1]+"alreadyexists");return;}if(!inFile.exists()){System.out.println(args[0]+"doesnotexist");return;}72精選2021版課件try{instr=newDataInputStream(newBufferedInputStream(newFileInputStream(inFile)));outstr=newDataOutputStream(newBufferedOutputStream(newFileOutputStream(outFile)));try{intdata;while(true){data=instr.readUnsignedByte();outstr.writeByte(data);}}catch(EOFExceptioneof){outstr.close();instr.close();return;}}catch(FileNotFoundExceptionnfx){System.out.println("Problemopeningfiles");}catch(IOExceptioniox){System.out.println("IOProblems");}}}73精選2021版課件第六章輸入/輸出流和文件6.1輸入/輸出流6.2文件讀寫寫文本文件讀文本文件寫二進(jìn)制文件讀二進(jìn)制文件File類對(duì)象序列化隨機(jī)文件讀寫74精選2021版課件6.2.6對(duì)象序列化(串行化)對(duì)象序列化概念:為了保存在內(nèi)存中的各種對(duì)象的狀態(tài),并且可以把保存的對(duì)象狀態(tài)再讀出來。Java提供一種保存對(duì)象狀態(tài)的機(jī)制——序列化(串行化)。目的:a)內(nèi)存中的對(duì)象保存到一個(gè)文件中或者數(shù)據(jù)庫中;b)用套接字在網(wǎng)絡(luò)上傳送對(duì)象;c)通過RMI傳輸對(duì)象;任務(wù):寫出對(duì)象實(shí)例變量的數(shù)值。如果變量是另一個(gè)對(duì)象的引用,則引用的對(duì)象也要序列化。方法:只有實(shí)現(xiàn)了Serializable接口的類的對(duì)象才可以被序列化;該對(duì)象必須與一定的對(duì)象輸入和輸出流聯(lián)系進(jìn)行狀態(tài)保存和狀態(tài)恢復(fù)。75精選2021版課件6.2.6對(duì)象序列化保存對(duì)象的信息,在需要的時(shí)候,再讀取這個(gè)對(duì)象內(nèi)存中的對(duì)象在程序結(jié)束時(shí)就會(huì)被垃圾回收機(jī)制清除用于對(duì)象信息存儲(chǔ)和讀取的輸入輸出流類:ObjectInputStreamObjectOutputStream76精選2021版課件6.2.6對(duì)象序列化ObjectInputStream和ObjectOutputStream實(shí)現(xiàn)對(duì)象的讀寫通過ObjectOutputStream把對(duì)象寫入磁盤文件通過ObjectInputStream把對(duì)象讀入程序不保存對(duì)象的transient和static類型的變量對(duì)象要想實(shí)現(xiàn)序列化,其所屬的類必須實(shí)現(xiàn)Serializable接口77精選2021版課件6.2.6對(duì)象序列化寫入ObjectOutputStream必須通過另一個(gè)流構(gòu)造ObjectOutputStream:FileOutputStreamout=newFileOutputStream("theTime");

ObjectOutputStream

s=newObjectOutputStream(out);s.writeObject("Today");s.writeObject(newDate());s.flush();s.close();78精選2021版課件6.2.6對(duì)象序列化用ObjectInputStream讀入必須通過另一個(gè)流構(gòu)造ObjectInputStream:FileInputStreamin=newFileInputStream("theTime");ObjectInputStream

s=newObjectInputStream(in);Stringtoday=(String)s.readObject();Datedate=(Date)s.readObject();79精選2021版課件6.2.6對(duì)象序列化Seriealizable接口空接口,使類的對(duì)象可實(shí)現(xiàn)序列化Serializable接口的定義packagejava.io;publicinterfaceSerializable{//there'snothinginhere!};實(shí)現(xiàn)Serializable接口的語句publicclassMyClassimplementsSerializable{...}使用關(guān)鍵字transient可以阻止對(duì)象的某些成員被自動(dòng)寫入文件80精選2021版課件6.2.6對(duì)象序列化對(duì)象序列化注意事項(xiàng):序列化只能保存對(duì)象的實(shí)例成員變量的值;狀態(tài)瞬時(shí)的對(duì)象不能序列化,保密的字段應(yīng)加transient關(guān)鍵字。定制序列化:默認(rèn)的序列化機(jī)制,按照名稱的升序?qū)懭肫鋽?shù)值,如果想控制這些數(shù)值的寫入順序和寫入類型,必須自己定義讀寫數(shù)據(jù)流的方式。81精選2021版課件6.2.6對(duì)象序列化創(chuàng)建一個(gè)書籍對(duì)象,并把它輸出到一個(gè)文件book.dat中,然后再把該對(duì)象讀出來,在屏幕上顯示對(duì)象信息classBookimplementsSerializable{ intid; Stringname; Stringauthor; floatprice; publicBook(intid,Stringname,Stringauthor,floatprice){ this.id=id; =name; this.author=author; this.price=price; }}82精選2021版課件importjava.io.*;publicclassSerialEx{publicstaticvoidmain(Stringargs[])throwsIOException,ClassNotFoundException{Bookbook=newBook(100032,"JavaProgrammingSkills","WangSir",30);ObjectOutputStreamoos=newObjectOutputStream(newFileOutputStream("c:\book.dat"));oos.writeObject(book);oos.close();book=null;ObjectInputStreamois=newObjectInputStream( newFileInputStream("c:\book.dat"));book=(Book)ois.readObject();ois.close();System.out.println("IDis:"+book.id);

System.out.println("nameis:"+);System.out.println("authoris:"+book.author);System.out.println("priceis:"+book.price);}}83精選2021版課件6.2.6對(duì)象序列化運(yùn)行結(jié)果將生成book.dat文件,并在屏幕顯示:IDis:100032nameis:JavaProgrammingSkillsauthoris:WangSirpriceis:30.0說明如果希望增加Book類的功能,使其還能夠具有借書方法borrowBook,并保存借書人的借書號(hào)borrowerI

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論