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