java08(第8章輸入輸出流).ppt
《java08(第8章輸入輸出流).ppt》由會(huì)員分享,可在線(xiàn)閱讀,更多相關(guān)《java08(第8章輸入輸出流).ppt(55頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
Java語(yǔ)言程序設(shè)計(jì),清華大學(xué)出版社,第8章輸入輸出流,第8章主要內(nèi)容,1、輸入輸出流2、文件處理3、隨機(jī)存取文件和本地可執(zhí)行文件4、數(shù)據(jù)流與對(duì)象流5、Java多媒體技術(shù),8.1輸入輸出流,8.1.1流的概念流是一個(gè)比文件所包含范圍更廣的概念。流是一個(gè)可被順序訪(fǎng)問(wèn)的數(shù)據(jù)序列,它是對(duì)計(jì)算機(jī)輸入數(shù)據(jù)和輸出數(shù)據(jù)的抽象。,圖8.1“流”是數(shù)據(jù)從一種設(shè)備流向另一種設(shè)備的過(guò)程,8.1.2io類(lèi)庫(kù),流序列中的數(shù)據(jù)既可以是未經(jīng)加工的原始二進(jìn)制數(shù)據(jù),也可以是經(jīng)一定編碼處理后符合某種格式規(guī)定的特定數(shù)據(jù)。所以Java中的數(shù)據(jù)流有字節(jié)流和字符流之分。,在java.io包中有四個(gè)基本類(lèi):InputStream、OutputStream及Reader、Writer類(lèi),它們分別處理字節(jié)流和字符流。如圖8.2所示。,,圖8.2流的分類(lèi),1、字節(jié)流,在io類(lèi)庫(kù)中,InputStream和OutputStream是處理字節(jié)數(shù)據(jù)的基本輸入輸出類(lèi),它們處于java.io包最頂層。這兩個(gè)類(lèi)均為抽象類(lèi),也就是說(shuō)它們不能被實(shí)例化,必須生成子類(lèi)之后才能實(shí)現(xiàn)一定的功能。,在java.io包中定義了很多這二個(gè)基本類(lèi)具體實(shí)現(xiàn)輸入輸出功能的子類(lèi),表8.1為部分常用字節(jié)輸入流類(lèi)和字節(jié)輸出流子類(lèi)的功能。,表8.1部分常用字節(jié)輸入流類(lèi)和輸出流類(lèi)的功能,2、字符流,處理字符數(shù)據(jù)的基本輸入輸出的類(lèi)是Reader和Writer,它們也處于java.io包最頂層,且這兩個(gè)類(lèi)均為抽象類(lèi),Java.io包中其它處理字符流的類(lèi)都是從這兩個(gè)類(lèi)繼承而來(lái)的。,由于Reader和Writer是抽象類(lèi),因此,在java.io包中定義了許多這二個(gè)處理字符流基本類(lèi)具體實(shí)現(xiàn)輸入輸出功能的子類(lèi),表8.2為部分常用字符輸入流類(lèi)和字符輸出流子類(lèi)的功能。,表8.2部分常用字符輸入流類(lèi)和輸出流類(lèi)的功能,8.2文件處理,8.2.1文件與目錄管理,,在Java語(yǔ)言的java.io包中,由File類(lèi)提供了描述文件和目錄的操作與管理方法。但File類(lèi)不是InputStream、OutputStream或Reader、Writer的子類(lèi),因?yàn)樗回?fù)責(zé)數(shù)據(jù)的輸入輸出,而專(zhuān)門(mén)用來(lái)管理磁盤(pán)文件與目錄。,1、創(chuàng)建File類(lèi)文件對(duì)象,File類(lèi)共提供了三個(gè)不同的構(gòu)造函數(shù),以不同的參數(shù)形式靈活地接收文件和目錄名信息。(1)Filef1=newFile(Stringpath)(2)Filef2=newFile(Stringpath,Stringname)(3)Filef3=newFile(Filedir,Stringname),2、獲取文件及目錄屬性,一個(gè)對(duì)應(yīng)于某磁盤(pán)文件或目錄的File對(duì)象一經(jīng)創(chuàng)建,就可以通過(guò)調(diào)用它的方法來(lái)獲得文件或目錄的屬性。,獲得文件或目錄的屬性,較常用的方法:,3、文件及目錄操作,File類(lèi)中還定義了一些對(duì)文件或目錄進(jìn)行管理、操作的方法,常用的方法有:(1)重命名文件publicbooleanrenameTo(FilenewFile);(2)刪除文件publicvoiddelete();(3)創(chuàng)建目錄publicbooleanmkdir();,8.2.2文件流,在Java中,操作二進(jìn)制文件使用字節(jié)輸入輸流,操作字符文件使用字符輸入輸出流。對(duì)文件進(jìn)行輸入輸出處理的四個(gè)類(lèi):FileInputStream:字節(jié)文件輸入流;FileOutputStream:字節(jié)文件輸出流;FileReader:字符文件輸入流;FileWriter:字符文件輸出流。,1、字節(jié)文件輸入流讀取文件,FileInputStream類(lèi)是從InputStream類(lèi)中派生出來(lái)的輸入流類(lèi),它用于處理二進(jìn)制文件的輸入操作。它的構(gòu)造方法有下面三種形式:FileInputStream(Stringfilename);FileInputStream(Filefile);FileInputStream(FileDescriptorfdObj);,(1)FileInputStream類(lèi),文件輸入流只是建立了一條通往數(shù)據(jù)的通道,應(yīng)用程序可以通過(guò)這個(gè)通道讀取數(shù)據(jù),要實(shí)現(xiàn)讀取數(shù)據(jù)的操作,需要使用read()方法。使用read()方法有三種格式:intread();intread(byteb[]);intread(byteb[],intoff,intlen);,(2)從文件輸入流中讀取字節(jié),【例8-1】,1./*讀取文件*/2.importjava.io.FileInputStream;3.importjavax.swing.JOptionPane;4.classExample8_15.{publicstaticvoidmain(Stringargs[])6.{bytebuffer[]=newbyte[2056];7.Stringstr;8.try{9.Filefile=newFile("d:/jtest/test.dat");10.FileInputStreamfileInput=newFileInputStream(file);11.intbytes=fileInput.read(buffer,0,2056);//讀到的字節(jié)數(shù)12.str=newString(buffer,0,bytes);13.}14.catch(Exceptione)15.{16.str=e.toString();17.}18.JOptionPane.showMessageDialog(null,str);19.System.exit(0);//退出程序20.}21.},2、字節(jié)文件輸出流寫(xiě)入文件,FileOutputStream類(lèi)是從OutputStream類(lèi)派生出來(lái)的輸出類(lèi),它具有處理向文件中寫(xiě)數(shù)據(jù)的能力。該類(lèi)主要應(yīng)用于處理字節(jié)文件流,例如圖像文件或聲音文件等。它的構(gòu)造方法有以下三種形式:FileOutputStream(Stringfilename)FileOutputStream(Filefile)FileOutputStream(FileDescriptorfdObj)其各參數(shù)的含義同F(xiàn)ileInputStream一樣。,(1)FileOutputStream類(lèi),(2)把字節(jié)發(fā)送到文件輸出流,與輸入流的功能類(lèi)似,輸出流只是建立了一條通往數(shù)據(jù)要去的目的地的通道,數(shù)據(jù)并不會(huì)自動(dòng)進(jìn)入輸出流通道,我們要使用write()方法把字節(jié)發(fā)送到輸出流。使用write()方法有三種格式:write(intb)write(byte[]b)write(byte[]b,intoff,intlen),3、字符文件流讀寫(xiě)文本文件,處理字符文件有二個(gè)與處理二進(jìn)制文件FileInputStream和FileOutputStream等價(jià)的類(lèi):FileReader和FileWriter,它們分別是Reader和Writer類(lèi)的子類(lèi)。,(1)FileReader和FileWriter,它們的構(gòu)造方法分別有三種形式:FileReader(Stringfilename);FileReader(Filefile);FileReader(FileDescriptorfdObj);FileWriter(Stringfilename);FileWriter(Filefile);FileWriter(FileDescriptorfdObj);,此外,Java還提供了BufferedReader類(lèi)和BufferedWriter類(lèi)與FileReader類(lèi)和FileWriter類(lèi)配合使用,將字符輸入或輸出到緩沖區(qū),使數(shù)據(jù)處理速度大大加快,提高了讀寫(xiě)效率。BufferedReader的構(gòu)造方法為:BufferedReader(Readerin);BufferedWriter的構(gòu)造方法為:BufferedWriter(Writerout);,與字節(jié)輸入輸出流的功能一樣,Reader和Writer只是建立一條通往字符文件的通道,而要實(shí)現(xiàn)對(duì)字符數(shù)據(jù)的讀寫(xiě)操作,還需要讀方法和寫(xiě)方法來(lái)完成。從輸入流中按行讀取字符的方法:StringreadLine();向輸出流寫(xiě)入多個(gè)字符的方法:write(Strings,intoff,intlen);刷新BufferedWriter所建立的緩沖區(qū):flush();關(guān)閉流:close();,(2)用字符流進(jìn)行讀寫(xiě)操作的方法,【例8-3】,【程序分析】,8.3隨機(jī)存取文件和本地可執(zhí)行文件,隨機(jī)存取文件流RandomAccessFile類(lèi)可以讀寫(xiě)文件中任意位置上的字節(jié)、文本等數(shù)據(jù)。它有二個(gè)構(gòu)造方法:(1)RandomAccessFile(Stringfilename,Stringmode)(2)RandomAccessFile(Filefile,Stringmode),8.3.1隨機(jī)存取文件流,【例8-4】,1./*隨機(jī)流*/2.importjava.io.*;3.classExample8_44.{5.publicstaticvoidmain(String[]args)6.{7.try{8.RandomAccessFilef=newRandomAccessFile("a.txt","rw");9.f.writeBytes("Zhangsiming");10.f.close();11.}12.catch(IOExceptione){13.System.out.println(e);14.}15.}16.},8.3.2本地可執(zhí)行文件,在Java語(yǔ)言中,使用java.lang包中的Runtime類(lèi)可以運(yùn)行本地機(jī)的可執(zhí)行文件。每個(gè)Java應(yīng)用程序都有一個(gè)Runtime類(lèi)實(shí)例對(duì)象,使應(yīng)用程序能夠與其運(yùn)行的環(huán)境相連接。但應(yīng)用程序不能創(chuàng)建自己的Runtime類(lèi)實(shí)例對(duì)象,而要通過(guò)該類(lèi)的靜態(tài)方法getRuntime()創(chuàng)建Runtime類(lèi)對(duì)象。,Runtime類(lèi)對(duì)象有幾個(gè)常用方法:,(1)exit(intstatus)(2)gc()(3)getRuntime()(4)exec(Stringcommand),【例8-7】,1.publicclassExample8_72.{publicstaticvoidmain(Stringargs[])3.{4.try{5.Runtimert=Runtime.getRuntime();6.rt.exec("c:/windows/system32/calc.exe");7.}8.catch(Exceptione){System.out.println(e);}9.}10.},8.4數(shù)據(jù)流與對(duì)象流,8.4.1數(shù)據(jù)流,有許多應(yīng)用程序需要將處理的數(shù)據(jù)作為Java的一種基本類(lèi)型(如布爾型,字節(jié),整數(shù)和浮點(diǎn)數(shù))來(lái)使用。這就要用到數(shù)據(jù)流類(lèi)DataInputStream類(lèi)和DataOutputStream類(lèi)。這兩個(gè)數(shù)據(jù)流類(lèi)是很有用處的,它們?cè)试S程序按機(jī)器無(wú)關(guān)的格式讀取Java原始數(shù)據(jù)。,建立DataInputStream類(lèi)和DataOutputStream類(lèi)的實(shí)例:publicDataInputStream(InputStreamin);publicDataOutputStream(OutputStreamout);,數(shù)據(jù)流類(lèi)DataInputStream類(lèi)和DataOutputStream類(lèi)的常用方法:,例如,下面是使用DataInputStream的一個(gè)程序段。DataInputStreamdis;dis=newDataInputStream(newFileInputStream(“records.dat”));//現(xiàn)以Java流的形式讀入文件records.dat中的數(shù)據(jù)for(;;){//設(shè)記錄由int,long,double型數(shù)據(jù)組成intfld1;longfld2;doublefld3;try{fld1=dis.readInt();fld2=dis.readLong();fld3=dis.readDouble();}catch(EOFExceptione){break;}},例如,下面是使用DataOutputStream實(shí)例的一個(gè)程序段。FileOutputStreamfileout=newFileOutputStream(“records.dat”);DataOutputStreamdos=newDataOutputStream(fileout);//現(xiàn)在Java數(shù)據(jù)流的形式寫(xiě)入文件records.datFor(intx=1;x<=100;x++){//設(shè)記錄由int,long,double型數(shù)據(jù)組成intfld1;longfld2;fld1=x+5;fld2=x*5;fld3=x*25;try{dos.writeInt(fld1);dos.writeLong(fld2);dos.writeDouble(fld3);}catch(IOExceptione){System.out.println(e);break;}},Java可以將對(duì)象作為一個(gè)整體通過(guò)對(duì)象流進(jìn)行傳輸和存儲(chǔ)。,8.4.2對(duì)象流,1、對(duì)象流的構(gòu)造方法ObjectInputStream類(lèi)和ObjectOutputStream類(lèi)的構(gòu)造方法為:ObjectInputStream(InputStreamin);ObjectOutputStream(OutputStreamout);,【例8-10】,程序分析:,2、對(duì)象序列化我們把描述對(duì)象狀態(tài)的數(shù)值寫(xiě)入字節(jié)流的過(guò)程稱(chēng)為對(duì)象序列化。對(duì)象序列化就是把一個(gè)對(duì)象的狀態(tài)記錄下來(lái)。Java提供給我們的絕大多數(shù)類(lèi)對(duì)象都是序列化對(duì)象,比如組件等。用戶(hù)自己定義的類(lèi)需要序列化時(shí),必須實(shí)現(xiàn)Serializable接口。這個(gè)接口非常簡(jiǎn)單,因?yàn)樗话魏涡枰獙?shí)現(xiàn)的方法。Serializable接口包含在java.io包中。另外,一個(gè)已序列化類(lèi)的子類(lèi)也是序列化的。,1.importjava.io.*;2.importjava.util.*;3.classAddressimplementsSerializable4.{5.protectedStringfirst,email;6.publicAddress()7.{8.first=email="";9.}10.publicAddress(String_first,String_email)11.{12.first=_first;13.email=_email;14.}15.publicStringtoString()16.{17.returnfirst+"("+email+")";18.}19.},【例8-11】,20.//主類(lèi)21.publicclassExample8_1122.{23.publicstaticvoidmain(Stringargs[])24.{25.try{26.FileOutputStreamfile=newFileOutputStream("test.dat");27.ObjectOutputStreamout=newObjectOutputStream(file);28.//定義對(duì)象29.Datenow=newDate();30.Addressaddress=newAddress("abc","abc@");31.//把對(duì)象寫(xiě)入對(duì)象流32.out.writeObject(now);33.out.writeObject(address);34.out.close();35.}36.catch(IOExceptionioe)37.{System.out.println(ioe);}38.}39.},注意:當(dāng)這個(gè)類(lèi)執(zhí)行時(shí),它創(chuàng)建一個(gè)包含恢復(fù)對(duì)象(即對(duì)對(duì)象進(jìn)行反序列化(deserialize))信息的Sample.dat數(shù)據(jù)文件。要知道這個(gè)程序是否正確地存儲(chǔ)數(shù)據(jù),最好的辦法還要看是否能夠成功地讀出所保存的數(shù)據(jù)。,8.5Java多媒體技術(shù),在Java中,可以使用Applet的靜態(tài)方法編寫(xiě)播放聲音的程序。但只能播放.au、.Wav、.Midi等格式的音頻文件。,8.5.1在A(yíng)pplet程序中播放聲音,1、使用play()方法播放聲音play(Urlurl,Stringname)【例8-13】1.importjava.applet.*;2.importjava.awt.Graphics;3.publicclassExample8_13extendsApplet{4.publicvoidpaint(Graphicsg){5.g.drawString("Listentothemusic!",25,25);6.play(getDocumentBase(),"笨小孩.mid");7.}8.},2、使用getAudioClip()方法播放聲音getAudioClip(Urlurl,Stringname);用getAudioClip()方法建立的AudioClip對(duì)象可以處理聲音:play()開(kāi)始播放loop()循環(huán)播放stop()停止播放,8.5.2Java多媒體包JMF的應(yīng)用,Java有一個(gè)多媒體包JMF(JavaMediaFramework),可以用來(lái)編寫(xiě)多媒體應(yīng)用程序。Sun公司的網(wǎng)站俄有JMF多媒體包下載,其文件名為:jmf-2_1_1e-windows-i586.exe。JMF提供給我們編寫(xiě)多媒體程序的包為javax.media。應(yīng)用JMF建立的多媒體程序可以播放.mpg、.avi、.mp3等格式的音頻及視頻文件。,建立一個(gè)多媒體程序有下列幾個(gè)步驟:,1、創(chuàng)建多媒體播放對(duì)象我們使用javax.media包中的manager類(lèi)的靜態(tài)方法createPlayer()創(chuàng)建一個(gè)多媒體播放對(duì)象player。try{URLmediaURL=newURL(getDocumentBase(),多媒體文件名);player=Manager.createPlayer(mediaURL);}catch(MalformedURLExceptione){}catch(IOExceptione){}catch(NoPlayerExceptione){},2、向多媒體播放對(duì)象注冊(cè)控制監(jiān)視器在javax.media包中有一個(gè)接口ControllerListener,我們應(yīng)用該接口向多媒體播放對(duì)象注冊(cè)控制監(jiān)視器:player.addControllerListener(監(jiān)視器);同時(shí),實(shí)現(xiàn)ControllerListener接口的方法:publicvoidcontrollerUpdate(ControllerEventevent)。在該方法中進(jìn)行創(chuàng)建播放組件及控制媒體的播放操作。,3、讓多媒體播放對(duì)象對(duì)播放媒體進(jìn)行預(yù)提取player.prefetch();多媒體播放對(duì)象進(jìn)行播放媒體預(yù)提取時(shí),將不斷獲得媒體文件的有關(guān)信息,每當(dāng)?shù)玫揭粋€(gè)新的信息將觸發(fā)ControllerEvent事件的發(fā)生。并通過(guò)監(jiān)視器調(diào)用方法controllerUpdate(ControllerEventevent)開(kāi)始播放多媒體文件。,4、啟動(dòng)多媒體播放對(duì)象player.start();5、停止并釋放多媒體播放對(duì)象player.stop();player.deallocate();player.close();示例:【例8-15】,8.5.3應(yīng)用輸入流播放音頻文件,在Sun公司的jdk自帶的rt.jar包文件中,有AudioStream.class、AudioPlayer.class類(lèi),我們使用以下語(yǔ)句進(jìn)行引用:importsun.audio.*;播放聲音文件時(shí),我們要使用輸入流:FileInputStreamfile=newFileInputStream("e.wav");AudioStreamaudio=newAudioStream(file);使用AudioPlayer類(lèi)的start()進(jìn)行播放:AudioPlayer.player.start(audio);,,示例:【例8-16】,本章結(jié)束!,- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來(lái)的問(wèn)題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
14.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁(yè)顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開(kāi)word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- java08 輸入輸出
鏈接地址:http://www.820124.com/p-11496727.html