




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第9章I/O流與文件2本章內(nèi)容輸入流輸出流文件39.1文件與流的概念文件的根本概念文件:存儲在磁盤上數(shù)據(jù)的集合,具有“永久性”文件中的數(shù)據(jù)以連續(xù)的字節(jié)或字符形式存在,并沒有明顯的構(gòu)造組成文件的字節(jié)序列或字符序列分別被稱為字節(jié)流或字符流流〔Stream〕:在計(jì)算機(jī)的輸入與輸出之間的數(shù)據(jù)序列;按確定挨次排列的數(shù)據(jù)的集合Java把不同的數(shù)據(jù)源與程序間的數(shù)據(jù)傳輸都抽象表述為“流”Java中的數(shù)據(jù)流有字節(jié)流〔位流〕和字符流之分Java命名慣例:但凡以InputStream或OutputStream結(jié)尾的類均為字節(jié)流但凡以Reader或Writer結(jié)尾的類均為字符流。流的根本概念Reader類Writer類InputStream類OutputStream類1字符=2字節(jié)就流的運(yùn)動方向而言,流可分為:輸入流〔inputstream〕:代表流入計(jì)算機(jī)的數(shù)據(jù)序列輸出流〔outputstream〕:代表從計(jì)算機(jī)流出的數(shù)據(jù)序列輸入流:程序翻開數(shù)據(jù)源上的一個流(文件或內(nèi)存等),然后按挨次讀入這個流中的數(shù)據(jù)輸出流:程序翻開一個目的地的流,然后按挨次從程序向這個目的地輸出數(shù)據(jù)輸入和輸出的方向是以程序?yàn)榛鶞?zhǔn)的通常,也把從輸入流中輸入數(shù)據(jù)到程序中稱為讀數(shù)據(jù)〔read〕,反之,從程序中將數(shù)據(jù)輸出到輸出流中稱為寫數(shù)據(jù)(write)具體步驟一般為:翻開一個流while(數(shù)據(jù)存在時)讀數(shù)據(jù)或?qū)憯?shù)據(jù)關(guān)閉流9.2字節(jié)輸入/輸出流派生自InputStream和OutputStream常用的字節(jié)流主要有:InputStream和OutputStreamFileInputStream和FileOutputStreamDataInputStream和DataOutputStreamObjectInputStream和ObjectOutputStreamBufferedInputStream和BufferedOutputStreamByteArrayInputStream和ByteArrayOutputStreamJava借助Java.io包實(shí)現(xiàn)輸入輸出InputStream類層次InputStreamFileInputStreamPipedInputStreamObjectInputStreamSequenceInputStreamFilterInputStreamStringBufferInputStreamByteArrayInputStreamDataInputStreamBufferedInputStreamPushbackInputStreamLineNumberInputStream9.2.1InputStream和FileInputStream抽象類java.io.InputStream是全部字節(jié)輸入流類的父類,定義了以字節(jié)為單位讀取數(shù)據(jù)的根本方法,并在其子類中進(jìn)展了分化和實(shí)現(xiàn)三個根本read方法:intread()//從輸入流讀取下一個字節(jié)并返回。返回值的范圍從0到255,假設(shè)已經(jīng)到達(dá)數(shù)據(jù)流的結(jié)尾,則返回-1intread(byte[]buffer)//從輸入流中讀取假設(shè)干字節(jié)放進(jìn)數(shù)組buffer中,并返回讀到的字符數(shù),最多可讀取和buffer長度相等的字符數(shù),假設(shè)讀取失敗則返回-1intread(byte[]buffer,intoffset,intlength)//從輸入流中讀length個字節(jié)到數(shù)組buffer中。offset是寫入數(shù)組的位置〔位移〕抽象方法11其它方法:voidclose//關(guān)閉輸入流,釋放相關(guān)系統(tǒng)資源intavailable//返回輸入流中可讀取的字節(jié)數(shù)skip(longn)//跳過流中假設(shè)干字節(jié)數(shù),返回實(shí)際跳過的字節(jié)數(shù)booleanmarkSupported//是否支持標(biāo)記和復(fù)位操作voidmark(intreadlimit)//在流中當(dāng)前位置作標(biāo)記voidreset//返回最近標(biāo)記的位置不執(zhí)行任何操作【例9-1】InputStream類的使用 import; import; publicclassInputStreamUse{ publicInputStreamUse(InputStreamin){ try{ while(true){ inti=in.read; charc=(char)i; System.out.print(c); } }catch(IOExceptione){ System.out.print(e); e.printStackTrace(); } } publicstaticvoidmain(String[]args){ newInputStreamUse(System.in); } } (“System.in引用的對象的類是:“+System.in.getClass.getName);該語句執(zhí)行后的輸出為: System.in引用的對象的類是:java.io.BufferedInputStream多態(tài):父類引用指向子類對象很有可能消逝特殊,最好處理FileInputStream類FileInputStream類〔文件輸入流〕是InputStream類的子類它們所供給的方法可以挨次讀/寫本地主機(jī)上的文件對文件內(nèi)容的操作步驟如下:創(chuàng)立文件對應(yīng)的輸入/輸出或者讀寫器的實(shí)例對象,以獵取相關(guān)的資源文件。如所需內(nèi)存空間以及文件的訪問權(quán)限對文件進(jìn)展讀〔輸入〕/寫〔輸出〕操作調(diào)用close方法,關(guān)閉文件,釋放所占用的系統(tǒng)資源【例9-2】FileInputStream類的使用〔 import; importjava.io.*; publicclassFileInputStreamUse{ publicFileInputStreamUse{ try{ FileInputStreamf=newFileInputStream(“數(shù)字.txt“); inti; intb=f.read();//讀取文件中的數(shù)據(jù) for(i=0;b!=-1;i++){ System.out.print((char)b); b=f.read;} ; (“文件字節(jié)數(shù)為“+i); f.close; }catch(IOExceptione){ System.err.println(e); e.printStackTrace(); } } publicstaticvoidmain(Stringargs[]){ newFileInputStreamUse;} }“數(shù)字.txt”是和該類在同一名目下的文本文件名和FileOutputStream字節(jié)輸出流抽象類OutputStream是全部字節(jié)輸出流類型的抽象父類,為其它輸出字節(jié)流子類供給了一些根本方法和標(biāo)準(zhǔn)接口三個根本的write方法:voidwrite(intc)//寫入一個字節(jié)到輸出流:將c的低8位寫入,無視24個高位voidwrite(byte[]buffer)//將數(shù)組buffer中的數(shù)據(jù)寫入輸出流voidwrite(byte[]buffer,intoffset,intlength)//將buffer數(shù)組中從第offset個字節(jié)開頭,共length個字節(jié)寫入輸出流其它方法:voidclose//關(guān)閉輸出流,釋放相關(guān)系統(tǒng)資源voidflush//清空緩存,將全部緩沖字節(jié)寫入輸出流寫入的數(shù)據(jù)通常先放到高速緩存(cache)里,等到達(dá)某一數(shù)量時,調(diào)用該方法將強(qiáng)迫數(shù)據(jù)寫到預(yù)期目標(biāo)OutputStream類層次OutputStreamFileOutputStreamObjectOutputStreamFilterOutputStreamByteArrayOutputStreamDataOutputStreamBufferedOutputStreamPrintStreamPipedOutputStream【例9-3】OutputStream類的使用import;importjava.io.*;publicclassOutputStreamUse{publicOutputStreamUse(OutputStreamout){Strings=“慈母手中線,游子身上衣。臨行密密縫,意恐遲遲歸。誰言寸草心,報得三春暉。“;byte[]b=s.getBytes();try{out.write(b);//將字節(jié)數(shù)組b寫出out.flush();//將把緩存中全部內(nèi)容強(qiáng)制輸出}catch(IOExceptione){System.err.println(e);e.printStackTrace();}}publicstaticvoidmain(Stringargs[]){newOutputStreamUse(System.out);}}FileOutputStream文件輸出流FileOutputStream類是OutputStream類的子類,用于向文件寫入數(shù)據(jù)FileOutputStream將數(shù)據(jù)寫入文件的步驟:實(shí)例化對象,獵取相關(guān)文件資源。通過FileOutputStream類的write方法把數(shù)據(jù)寫入到文件中;通過flush方法強(qiáng)制輸出調(diào)用close方法,關(guān)閉文件,釋放系統(tǒng)資源【例9-4】FileOutputStream類的使用import;importjava.io.*;publicclassFileOutputStreamUse{publicFileOutputStreamUse{Strings=“有志者事竟成,破釜沉舟,百二秦關(guān)終屬楚;苦心人天不負(fù),臥薪嘗膽,三千越甲可吞吳?!?byte[]b=s.getBytes();try{ FileOutputStreamf=newFileOutputStream(“座右銘.txt“);f.write(b);f.flush();f.close();}catch(IOExceptione){System.err.println(e);e.printStackTrace();}}publicstaticvoidmain(Stringargs[]){ newFileOutputStreamUse;}}假設(shè)文件不存在就創(chuàng)立該文件,否則掩蓋原文件內(nèi)容append為true時,使用FileOutputStream(Stringname,booleanappend)方法創(chuàng)立的實(shí)例在文本文件尾追加字符,而非掩蓋數(shù)據(jù)字節(jié)輸入流DataInputStream類和數(shù)據(jù)字節(jié)輸出流DataOutputStream類供給直接讀或?qū)懜緮?shù)據(jù)類型數(shù)據(jù)的方法DataInputStream能夠以一種與機(jī)器無關(guān)的方式,直接從底層字節(jié)輸入流讀取Java根本類型和Sring類型的數(shù)據(jù),而不必關(guān)心這個數(shù)值應(yīng)當(dāng)是多少個字節(jié)9.2.3DataInputStream和DataOutputStreamDataInputStream常用方法包括:publicDataInputStream(InputStreamin)publicfinalbooleanreadBooleanpublicfinalbytereadBytepublicfinalcharreadCharpublicfinaldoublereadDoublepublicfinalfloatreadFloatpublicfinalintreadIntpublicfinallongreadLongpublicfinalshortreadShortpublicfinalStringreadUTFpublicvoidclose
讀入一個字符串DataOutputStream則能夠直接將Java根本類型和String類型數(shù)據(jù)寫出到其它的字節(jié)輸出流DataInputStream常用方法包括:publicDataOutputStream(OutputStreamout)publicfinalvoidwriteByte(intv)publicfinalvoidwriteShort(intv)publicfinalvoidwriteInt(intv)publicfinalvoidwriteLong(longv)publicfinalvoidwriteFloat(floatv)publicfinalvoidwriteDouble(doublev)publicfinalvoidwriteChar(intv)publicfinalvoidwriteBoolean(booleanv)publicfinalvoidwriteChars(Strings)publicfinalintsize;//返回實(shí)際寫入的字節(jié)數(shù)publicvoidflushpublicvoidcloseimport;import;import;import;publicclassDataStreamUse{publicDataStreamUse{try{FileOutputStreamfout=newFileOutputStream(“out.txt“);DataOutputStreamdfout=newDataOutputStream(fout);for(inti=0;i<6;i++)dfout.writeInt(i);dfout.close();FileInputStreamfin=newFileInputStream(“out.txt“);DataInputStreamdfin=newDataInputStream(fin);for(inti=0;i<6;i++)System.out.print(dfin.readInt+“,“);dfin.close();}catch(Exceptione){System.err.println(e);e.printStackTrace();}}publicstaticvoidmain(Stringargs[]){ newDataStreamUse;}}【例9-5】數(shù)據(jù)字節(jié)流的使用從一個流產(chǎn)生另一個流9.2.4ObjectInputStream和ObjectOutputStream類ObjectOutputStream和ObjectInputStream分別繼承了接口ObjectOutput和ObjectInput,將數(shù)據(jù)流功能擴(kuò)展到可以讀寫對象ObjectInputStream類和ObjectOutputStream類創(chuàng)立的對象被稱為對象輸入流和對象輸出流對象輸出流使用writeObject(Objectobj)方法將一個對象obj寫入輸出流,將對象狀態(tài)保存下來(將對象保存到文件中,或者通過網(wǎng)絡(luò)傳送到其他地方)對象輸入流使用readObject從源中讀取一個對象到程序中,將對象狀態(tài)恢復(fù)Java允許可序列化的對象通過對象流進(jìn)展傳輸只有實(shí)現(xiàn)Serializable接口的類才能被序列化;Serializable接口中沒有任何方法,當(dāng)一個類聲明實(shí)現(xiàn)Serializable接口時,只是說明該類參與對象序列化協(xié)議一個類假照實(shí)現(xiàn)了Serializable接口,那么這個類創(chuàng)立的對象就是所謂可序列化的對象實(shí)際上,類ObjectOutputStream和ObjectInputStream分別實(shí)現(xiàn)了對象的序列化和反序列化功能恢復(fù)對象狀態(tài)保存對象狀態(tài)序列化只能保存對象的非靜態(tài)成員變量〔且保存的只是變量的值〕,而不能保存任何成員方法和靜態(tài)成員變量某些對象的狀態(tài)是瞬時的,無法保存,如Thread對象或流對象。對于這樣的成員變量,必需用transient關(guān)鍵字標(biāo)明。任何用transient關(guān)鍵字聲明的成員變量都不會被保存序列化可能將對象存放到磁盤上或在網(wǎng)絡(luò)上發(fā)送,會產(chǎn)生安全問題。需要保密的數(shù)據(jù)不應(yīng)保存在永久介質(zhì)中〔或不應(yīng)簡潔地不加處理地保存下來〕。為保證安全,應(yīng)在這些變量前加上transient關(guān)鍵字有時我們想得到對象的一個“復(fù)制品”,該復(fù)制品的實(shí)體是原對象實(shí)體的拷貝。復(fù)制品實(shí)體的變化不會引起原對象實(shí)體發(fā)生變化,這樣的復(fù)制品稱為原對象的克隆對象或簡稱克隆。使用對象流很簡潔得獵取一個序列化對象的克隆。我們只需將該對象寫入到對象輸出流,那么用對象輸入流讀回的對象確定是原對象的一個克隆9.2.5BufferedInputStream和BufferedOutputStream類BufferedInputStream和類BufferedOutputStream是帶緩存的輸入流和輸出流,即緩沖流在實(shí)例化類BufferedInputStream和類BufferedOutputStream對象時,會在內(nèi)存中開拓一個字節(jié)數(shù)組用來存放數(shù)據(jù)流中的數(shù)據(jù)借助字節(jié)數(shù)組,在讀取或者存儲數(shù)據(jù)時可以以字節(jié)數(shù)組為單位把數(shù)據(jù)讀入內(nèi)存,或以字節(jié)數(shù)組為單位把數(shù)據(jù)寫入指定的文件中,從而大大提高數(shù)據(jù)的讀/寫效率類BufferedInputStream的構(gòu)造方法:BufferedInputStream(InputStreamin)其中in是指定的輸入流,通常是FileInputStream的實(shí)例對象。BufferedInputStream(InputStreamin,intsize)其中,in同前,size是大于0的數(shù),用于指定緩存大小與類BufferedOutputStream的構(gòu)造方法類似從一個流構(gòu)造另一個流從底層流構(gòu)造高級流時就會創(chuàng)立流鏈FileInputStreamf=newFileInputStream(“file.dat“);BufferedInputStreamb=newBufferedInputStream(f);DataInputStreamd=newDataInputStream(b);【例9-8】緩存流的使用import;import;import;publicclassBufferedStreamUse{privatestaticStringfileName=“畢業(yè)那年我們二十三歲.txt“;publicBufferedStreamUse{try{inti=0;intch; Dated1=newDate;//創(chuàng)立獵取當(dāng)前時間的對象FileInputStreamf=newFileInputStream(fileName);while((ch=f.read)!=-1)i++;f.close();Dated2=newDate; longt=d2.getTime-d1.getTime; (“讀取文件%s(共%d字節(jié))\n“,fileName,i); (“不帶緩存的方法需要%1$d毫秒\n“,t); i=0;d1=newDate;f=newFileInputStream(fileName);BufferedInputStreamfb=newBufferedInputStream(f);while((ch=fb.read)!=-1)i++;fb.close;d2=newDate;t=d2.getTime-d1.getTime; (“帶緩存的方法需要%1$d毫秒\n“,t);}catch(Exceptione){System.err.println(e);e.printStackTrace;}}publicstaticvoidmain(Stringargs[]){ newBufferedStreamUse; }}標(biāo)準(zhǔn)的輸入/輸出流java.lang包的System類定義了三個靜態(tài)成員變量:staticfinalInputStreamin//標(biāo)準(zhǔn)輸入instaticfinalPrintStreamout//標(biāo)準(zhǔn)輸出outstaticfinalPrintStreamerr//標(biāo)準(zhǔn)錯誤輸出errin可以直接調(diào)用InputStream類供給的輸入方法;out和err可以直接調(diào)用PrintStream類供給的輸出方法out用于屏幕輸出,常用方法有:System.out.print(Stringstr);//向屏幕輸出字符串strSystem.out.println(Stringstr);//向屏幕輸出字符串str后換行in用于屏幕輸入,常用方法有:System.in.read//返回從鍵盤輸入的字符System.in.read(byte[]b)//從鍵盤輸入多個字符到數(shù)組b,并返回字符個數(shù)都可被重定向;err通常不;out會被緩沖,err不會PrintStream類PrintStream是標(biāo)準(zhǔn)的輸出類,在OutputStream根底上供給了增加的功能,可以便利地輸出各種類型數(shù)據(jù)〔而不僅限于byte型〕的格式化表示形式PrintStream從不拋出IOException類〔可用checkError方法檢測〕構(gòu)造方法:publicPrintStream(OutputStreamout);publicPrintStream(OutputStreamout,BooleanautoFlsh);//是否自動刷新36autoFlash為true時,承受自動刷新,當(dāng)輸出回車換行時,緩存中的數(shù)據(jù)一般會全部自動寫入。默認(rèn)不自動刷新將向其中寫入的目標(biāo)流PrintStream常用方法:publicvoidprint(booleanb);publicvoidprint(charc);publicvoidprint(longl);publicvoidprint(inti);publicvoidprint(floatf);publicvoidprint(doubled)
;publicvoidprint(Strings);publicvoidprint(Objectobj);publicvoidprintln;37將指定數(shù)據(jù)寫入目標(biāo)流println【例9-9】標(biāo)準(zhǔn)輸入/輸出流的使用importjava.io.IOException;publicclassStandardInputOutputUse{//拋出特殊交由Java虛擬機(jī)處理publicstaticvoidmain(Stringargs[])throwsIOException{(“請從鍵盤上輸入數(shù)據(jù):“);bytebuffer[]=newbyte[512]; intcount=System.in.read(buffer);(“通過標(biāo)準(zhǔn)的輸出,輸出的數(shù)據(jù):“);for(inti=0;i<count;i++)(““+buffer[i]);//按字節(jié)方式輸出buffer;for(inti=0;i<count;i++)System.out.print((char)buffer[i]);//按字符方式輸出bufferSystem.out.println(“count=“+count);//實(shí)際讀取的字節(jié)數(shù)}}9.3字符輸入/輸出流以16位的Unicode碼表示的字符為根本處理單位,又稱為讀/寫器由抽象類Reader和Writer派生常用的字符流主要有:Reader和WriterFileReader和FileWriterBufferedReader和BufferedWriter9.3.1Reader和Writer抽象類Reader和Writer只是供給了一系列用于字符流處理的方法,只能通過使用由它們派生出來的子類對象來處理字符流Reader是全部字符輸入流類型的父類,其中聲明白用于讀取字符流的有關(guān)方法三個根本的read方法:intread//讀取一個字符,返回值為讀取的字符intread(charcbuf[])//讀取一系列字符到數(shù)組cbuf[]中,返回值為實(shí)際讀取的字符數(shù)intread(char,cbuf[],intoff,intlen)//讀取len個字符,從數(shù)組cbuf[]的下標(biāo)off處開頭存放,返回值為實(shí)際讀取的字符數(shù)抽象方法讀到文件末尾時返回-1其它方法:voidclose//關(guān)閉當(dāng)前字符流并釋放與字符流相關(guān)的系統(tǒng)資源skip(longn)//略過n個字節(jié)不讀取,返回實(shí)際略過的字節(jié)數(shù)目booleanmarkSupported//推斷當(dāng)前流是否支持做標(biāo)記voidmark(intreadAheadLimit)voidreset//將當(dāng)前流重置到做標(biāo)記處Reader類層次FilterReaderPushbackReaderReaderBufferedReaderStringReaderCharArrayReaderInputStreamReaderPipedReaderFileReaderLineNumberReader抽象類Writer是全部字符輸出流類型的共同父類五個根本的write方法:voidwrite(intc)//將整數(shù)c的低16位寫入當(dāng)前輸出流voidwrite(char[]cbuf)//將字符數(shù)組cbuf[]寫入當(dāng)前輸出流voidwrite(char[]cbuf,intoffset,intlength)//將字符數(shù)組cbuf[]中從下標(biāo)off處開頭的len個字符寫入當(dāng)前輸出流voidwrite(Stringstr)//將字符串str寫入當(dāng)前輸出流voidwrite(Stringstr,intoff,intlen)//將字符串str中從下標(biāo)off處開頭的len個字符寫入當(dāng)前輸出流其它方法:Writerappend(CharSequencecsq)//將字符序列csq添加到當(dāng)前輸出流Writerappend(charc)//將字符c添加到當(dāng)前輸出流voidclose//關(guān)閉當(dāng)前字符流并釋放相關(guān)系統(tǒng)資源voidflush//清空緩存,使全部緩沖字符立刻寫入輸出流Writer類層次WriterBufferedWriterStringWriterCharArrayWriterPipedWriterOutputStreamWriterPrintWriterFilterWriterFileWriter9.3.2FileReader和FileWriter抽象類Reader和Writer類的子類,用于讀、寫字符文件與FileInputStream、FileOutputStream字節(jié)流相對應(yīng)【例9-10】文件字符流的使用import;import;import;publicclassFileReaderWriterUse{publicFileReaderWriterUse{try{ FileWriterwriter=newFileWriter(“日記.txt“); writer.write(“今日特殊歡快,上午在路上幫助一個女生撿書。下午幫助一個同學(xué)答到〔沒有被教師覺察〕,雖然教師沒有覺察,但是我還是很內(nèi)疚,究竟這是不允許的,也是不厚道的事情。晚上同學(xué)過生日,蹭一頓飯,甚是歡快!最糾結(jié)的事情是明天教師要提問。希望明天會更好!“);writer.close(); FileReaderreader=newFileReader(“日記.txt“);for(intc=reader.read();c!=-1;c=reader.read())System.out.print((char)c);reader.close();}catch(IOExceptione){System.err.println(e);e.printStackTrace();}}publicstaticvoidmain(Stringargs[]){ newFileReaderWriterUse; }}9.3.3BufferedReader和BufferedWriterBufferedReader類、LineNumberReader類和BufferedWriter類以緩沖流方式進(jìn)展數(shù)據(jù)讀寫操作BufferedReader類的構(gòu)造方法:BufferedReader(Readerin);//使用缺省的緩沖區(qū)大小BufferedReader(Readerin,intsz);//sz為緩沖區(qū)的大小除了read和write方法外還供給了整行字符處理方法:StringreadLine//讀取一行字符串,輸入流完畢時返回null默認(rèn)大小足夠用行處理字符流LineNumberReader是類BufferedReader的子類。構(gòu)造方法:LineNumberReader(Readerin);LineNumberReader(Readerin,intsz);行:由換行符〔‘\n’〕、回車符〔‘\r’〕或二者共同終止StringgetLineNumber//獵取當(dāng)前行號voidsetLineNumber(int)//設(shè)置當(dāng)前行號默認(rèn)行號從0開頭,隨數(shù)據(jù)讀取在每個行完畢符處遞增不實(shí)際更改流中當(dāng)前位置;只改getLineNumber將返回的值BufferedWriter將數(shù)據(jù)緩沖到字符輸出流。構(gòu)造方法:BufferedWriter(Writerout);BufferedWriter(Writerout,intsz);行處理方法:voidnewLine//向輸出流中寫入一個行完畢標(biāo)志不是簡潔的換行符‘\n’或‘\r’,而是系統(tǒng)定義的行隔離標(biāo)志〔lineseparator〕【例9-11】緩沖字符流的使用import;import;import;import;import;publicclassBufferedReaderWriterUse{publicBufferedReaderWriterUse{try{ BufferedWriterbw=newBufferedWriter(newFileWriter(“勵志.txt“));bw.write(“有志者,事競成“);bw.newLine;bw.write(“苦心人,天不負(fù)“);bw.newLine;bw.close;LineNumberReaderbr=newLineNumberReader(newFileReader(“勵志.txt“));Strings;for(s=br.readLine;s!=null;s=br.readLine)System.out.println(br.getLineNumber+“:“+s);br.close;}catch(IOExceptione){System.err.println(e);e.printStackTrace;}}publicstaticvoidmain(Stringargs[]){ newBufferedReaderWriterUse;}}9.4文件操作類File類的對象是磁盤上的文件和路徑的抽象表示形式,可設(shè)置文件或者名目的各種屬性:文件名、文件大小、文件類型、文件修改日期和文件權(quán)限等;可推斷指定文件是否存在、獵取當(dāng)前文件路徑、獵取當(dāng)前名目文件列表、創(chuàng)立文件、刪除文件、創(chuàng)立名目和刪除名目等不涉及對文件的讀寫操作〔文件內(nèi)容的讀/寫操作由流實(shí)現(xiàn)〕File類的實(shí)例是不行變的,即:一旦創(chuàng)立,F(xiàn)ile對象表示的抽象路徑名將永不轉(zhuǎn)變File類構(gòu)造方法File(Stringpathname)例如,封裝一個文件:Filef1=newFile(“mydir\\myfile.txt”);例如,封裝一個名目:Filef2=newFile(“d:\\mydir\\dir1”);File(Stringparent,Stringchild),例如:Filef3=newFile(“d:\\d1”,“a.java”)File(Filedir,Stringname),例如:Filef4=newFile(f2,”myfile.txt”);分隔符:win\\unix/使用相對路徑,移植性較好確定路徑File類方法推斷目標(biāo)是否存在:publicbooleanexists推斷是文件還是名目:publicbooleanisFile;publicbooleanisDirectory;獵取文件名稱或整個路徑publicStringgetName//僅返回文件名publicStringgetPath//返回整個路徑publicStringgetAbsolutePath//返回確定路徑獵取文件讀寫屬性:publicbooleancanRead//是否可讀publicbooleancanWrite//是否可寫File類方法獵取上一級名目:publicStringgetParent獵取文件長度:publiclonglength獵取最近一次修改的時間: publiclonglastModified列出當(dāng)前名目中的文件和名目:publicString[]listpublicFile[]listFiles重命名:publicbooleanrenameTo(Filenew)刪除文件或名目:publicbooleandelete;創(chuàng)立名目:publicbooleanmkdir【例9-12】文件類的使用importjava.io.File;importjava.util.Date;importjava.text.SimpleDateFormat;importjava.io.IOException;publicclassFileUse{publicFileUse{Filedir=newFile(“.“);//當(dāng)前名目intcount_dirs=0;//統(tǒng)計(jì)名目數(shù)intcount_files=0;//統(tǒng)計(jì)文件數(shù)longbyte_files=0;//統(tǒng)計(jì)全部文件總字節(jié)數(shù)System.out.println(dir.getAbsolutePath+“名目\r\n“);//SimpleDateFormat類是日期格式轉(zhuǎn)換〔日期->文本〕、〔文本->日期〕SimpleDateFormatsdf=newSimpleDateFormat(“yyyy-MM-ddhh:mm“); File[]files=dir.listFiles;
for(inti=0;i<files.length;i++){System.out.print(files[i].getName+“\t“);//顯示文件名if(files[i].isFile){//推斷指定File對象是否是文件System.out.print(files[i].length+“B\t“);//顯示文件長度count_files++;byte_files+=files[i].length;}else{ //<DIR>是查看當(dāng)前所在名目的文件和名目(“<DIR>\t“);count_dirs++;}System.out.println(sdf.format(newDate(files[i].lastModified)));}System.out.println(“\r\n共有“+count_files+“個文件,總字節(jié)數(shù)為“+byte_files);(“共有“+count_dirs+“個名目“);}publicstaticvoidmain(Stringargs[])throwsIOException{newFileUse;}}隨機(jī)訪問文件類通常,輸入流只能從中讀取數(shù)據(jù),而不能向其寫出數(shù)據(jù);輸出流則只能向其寫出數(shù)據(jù),而不能從中讀取數(shù)據(jù)。但有一個特例:RandomAccessFile類,直接繼承object,同時實(shí)現(xiàn)了接口DataInput和DataOutput該類創(chuàng)立的流的指向既可以作為源也可以作為目的地,所以既可以用來處理文件的輸入,又可以處理文件的輸出,實(shí)現(xiàn)對同一個文件的交替讀寫,并允許指定讀寫位置字節(jié)流RandomAccessFile類將文件看作字節(jié)數(shù)組,用文件指針指示當(dāng)前位置新建RandomAccessFile類的對象后,文件指針指向文件頭讀取或存儲數(shù)據(jù)后,文件指針指向剛讀取或?qū)懭氲臄?shù)據(jù)后由于Java的各種根本數(shù)據(jù)類型大小固定,不依靠于具體的計(jì)算機(jī)或操作系統(tǒng),所以可便利地計(jì)算出文件指針的當(dāng)前位置和所需移動到的位置59構(gòu)造方法:RandomAccessFile(Filefile,Stringmode)//file指定流的源,同時也是流目的地;mode取r〔只讀〕或rw〔可讀寫〕準(zhǔn)備流對文件的訪問權(quán)限RandomAccessFile(Stringname,Stringmode)//name指定一個文件名,給出流的源,同時也是流目的地。訪問模式mode取r〔只讀〕或rw〔可讀寫〕準(zhǔn)備流對文件的訪問權(quán)限60常用方法:longgetFilePointer;//獵取文件指針位置〔距文件頭的字節(jié)數(shù)〕voidseek(longpos)//設(shè)置文件指針到pos處,pos為整數(shù),表示字節(jié)數(shù),為0時表示移到文件頭intread//讀取一個字節(jié)voidwrite(intv)//寫入v的低8位StringreadLine//讀入一行l(wèi)onglength//返回文件長度voidclose//關(guān)閉文件61intreadInt//讀取一個整數(shù)voidwriteInt(intv)//寫入一個整數(shù)……讀寫根本數(shù)據(jù)類型數(shù)據(jù)及字符串62【例9-13】隨機(jī)訪問文件類的使用importjava.io.RandomAccessFile;importjava.io.IOException;
publicclassRandomAccessFileUse{publicRandomAccessFileUse{try{RandomAccessFilef=newRandomAccessFile(“寫偶數(shù).txt“,“rw“);inta; for(inti=0;i<10;i++)//寫入10個偶數(shù):0,2,4,6,...,18f.writeInt(2*i); f.seek(8);/*定位到第三個偶數(shù)上*/ f.writeInt(0);f.seek(0);//將文件指針定位到文件的頭部 for(inti=0;i<10;i++){a=f.readInt;System.out.println(“[“+i+“]:“+a);}f.close();}catch(IOExceptione){System.err.println(e);e.printStackTrace();}}publicstaticvoidmain(Stringargs[]){ newRandomAccessFileUse;}}63文件過濾器接口使用帶通配符的過濾條件可以只查看滿足條件的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年勞動合同工齡延續(xù)模板
- 一年級下冊數(shù)學(xué)教案-4.5求減數(shù)的簡單實(shí)際問題 蘇教版
- 二年級數(shù)學(xué)下冊教案-6.1 認(rèn)識角(4)-北師大版
- 2025年學(xué)習(xí)雷鋒精神六十二周年主題活動方案
- 學(xué)習(xí)2025年雷鋒精神62周年主題活動方案 (合計(jì)3份)
- 2025年廣東工貿(mào)職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性測試題庫參考答案
- 2025年湖北國土資源職業(yè)學(xué)院單招職業(yè)傾向性測試題庫及答案1套
- 《雁門太守行》歷年中考古詩欣賞試題匯編(截至2024年)
- 《春望》歷年中考古詩欣賞試題匯編(截至2024年)
- 2025年杭州科技職業(yè)技術(shù)學(xué)院單招職業(yè)傾向性測試題庫及參考答案
- 活在課堂里 課件
- 教科版五年級下冊科學(xué)同步練習(xí)全冊
- 汶川地震波時程記錄(臥龍3向)
- 震旦ad188維修手冊
- 五金英語詞匯盤點(diǎn)
- 內(nèi)容講義說明案例nxt pop trainning
- 工業(yè)自動化設(shè)備項(xiàng)目用地申請報告(模板)
- 2021年羽毛球比賽規(guī)則及裁判手勢
- 標(biāo)準(zhǔn)色卡(建筑類)下載
- 現(xiàn)代科學(xué)技術(shù)概論復(fù)習(xí)重點(diǎn)
- NB∕T 32004-2018 光伏并網(wǎng)逆變器技術(shù)規(guī)范
評論
0/150
提交評論