第九章 輸入輸出處理_第1頁
第九章 輸入輸出處理_第2頁
第九章 輸入輸出處理_第3頁
第九章 輸入輸出處理_第4頁
第九章 輸入輸出處理_第5頁
已閱讀5頁,還剩56頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第九章輸入/輸出處理常州信息職業(yè)技術(shù)學(xué)院(CCIT)軟件學(xué)院CCIT軟件學(xué)院2本講內(nèi)容1、I/O概述2、I/O字節(jié)流3、I/O字符流4、隨機(jī)訪問文件CCIT軟件學(xué)院31.I/O概述

大部分程序都需要輸入/輸出處理,比如從鍵盤讀取數(shù)據(jù)、向屏幕中輸出數(shù)據(jù)、從文件中讀或者向文件中寫數(shù)據(jù)、在一個(gè)網(wǎng)絡(luò)連接上進(jìn)行讀寫操作等。在Java中,把這些不同類型的輸入、輸出抽象為流(Stream),而其中輸入或輸出的數(shù)據(jù)則稱為數(shù)據(jù)流(DataStream),用統(tǒng)一的接口來表示,從而使程序設(shè)計(jì)簡(jiǎn)單明了。CCIT軟件學(xué)院41.I/O概述流一般分為輸入流(InputStream)和輸出流(OutputStream)兩類,但這種劃分并不是絕對(duì)的。比如一個(gè)文件,當(dāng)向其中寫數(shù)據(jù)時(shí),它就是一個(gè)輸出流;當(dāng)從其中讀取數(shù)據(jù)時(shí),它就是一個(gè)輸入流。當(dāng)然,鍵盤只是一個(gè)數(shù)人流,而屏幕則只是一個(gè)輸出流。在Java開發(fā)環(huán)境中,主要是由包java.io中提供的一系列的類和接口來實(shí)現(xiàn)輸入/輸出處理。標(biāo)準(zhǔn)輸入/輸出處理則是由包java.lang中提供的類來處理的,但這些類又都是從包java.io中的類繼承而來。CCIT軟件學(xué)院51.I/O概述在JDK1.1之前,java.io包中的流只有普通的字節(jié)流(以byte為基本處理單位的流),這種流對(duì)于以16位的Unicode碼表示的字符流處理很不方便。從JDK1.1開始,java.io包中加入了專門用于字符流處理的類(以Reader和Writer為基礎(chǔ)派生的一系列類)。另外,為了使對(duì)象的狀態(tài)能夠方便地永久保存下來,JDK1.1以后的java.io包中提供了以字節(jié)流為基礎(chǔ)的用于對(duì)象的永久化保存狀態(tài)的機(jī)制(通過實(shí)現(xiàn)ObjectInput和ObjectOutput接口)。CCIT軟件學(xué)院61.I/O字節(jié)流InputStreamByteArrayInputStreamFileInputStreamFilterInputStream

BufferedInputStreamDataInputStreamLineNumberInputStream

PushbackInputStreamObjectInputStreamPipedInputStreamSequenceInputStreamStringBufferInputStreamOutputStreamByteArrayOutputStreamFileOutputStreamFilterOutputStreamBufferedOutputStreamDataOutputStreamPrintStreamObjectOutputStreamPipedOutputStreamCCIT軟件學(xué)院71.I/O字符流ReaderBufferedReaderLineNumberReaderCharArrayReaderFilterReaderPushbackReaderInputStreamReaderFileReaderPipedReaderStringReaderWriterBufferedWriterCharArrayWriterFilterWriterOutputStreamWriterFileWriterPipedWriterStringWriterPrintWriterCCIT軟件學(xué)院81.I/O接口與文件操作DataInputObjectInputDataOutputObjectOutputFileFilterFilenameFilterObjectInputValidationObjectStreamConstantsSerializableExternalizableFileFileDescriptorRandomAccessFilejava.awt.FileDialogCCIT軟件學(xué)院92.字節(jié)流——InputStream

read():從流中讀入數(shù)據(jù)skip():跳過流中若干字節(jié)數(shù)available():返回流中可用字節(jié)數(shù)mark():在流中標(biāo)記一個(gè)位置reset():返回標(biāo)記過得位置markSupport():是否支持標(biāo)記和復(fù)位操作close():關(guān)閉流CCIT軟件學(xué)院102.字節(jié)流——InputStreamintread()從輸入流中讀一個(gè)字節(jié),形成一個(gè)0~255之間的整數(shù)返回(是一個(gè)抽象方法)。intread(byteb[])讀多個(gè)字節(jié)到數(shù)組中。intread(byteb[],intoff,intlen)從輸入流中讀取長(zhǎng)度為len的數(shù)據(jù),寫入數(shù)組b中從索引off開始的位置,并返回讀取得字節(jié)數(shù)。對(duì)于這三個(gè)方法,若返回-1,表明流結(jié)束。CCIT軟件學(xué)院112.字節(jié)流——OutputStreamwrite(intb)將一個(gè)整數(shù)輸出到流中(只輸出低位字節(jié),抽象)write(byteb[])將字節(jié)數(shù)組中的數(shù)據(jù)輸出到流中write(byteb[],intoff,intlen)將數(shù)組b中從off指定的位置開始,長(zhǎng)度為len的數(shù)據(jù)輸出到流中flush():刷空輸出流,并將緩沖區(qū)中的數(shù)據(jù)強(qiáng)制送出close():關(guān)閉流CCIT軟件學(xué)院122.字節(jié)流——例子1把輸入流中的所有內(nèi)容復(fù)制到輸出流中publicvoidcopy(InputStreamin,OutputStreamout)throwsIOException{byte[]buf=newbyte[4096];intlen=in.read(buf);while(len!=-1){out.write(buf,0,len);len=in.read(buf);}}CCIT軟件學(xué)院132.字節(jié)流——文件流FileInputStream:類用來打開一個(gè)輸入文件,若要打開的文件不存在,則會(huì)產(chǎn)生例外FileNotFoundException,這是一個(gè)非運(yùn)行時(shí)例外,必須捕獲或聲明拋棄;FileOutputStream:類用來打開一個(gè)輸出文件,若要打開的文件不存在,則會(huì)創(chuàng)建一個(gè)新的文件,否則原文件的內(nèi)容會(huì)被新寫入的內(nèi)容所覆蓋。在進(jìn)行文件的讀/寫操作時(shí),會(huì)產(chǎn)生非運(yùn)行時(shí)例外IOException,必須捕獲或聲明拋棄(其它的輸入/輸出流處理時(shí)也同樣需要進(jìn)行輸入/輸出例外處理)。CCIT軟件學(xué)院142.字節(jié)流——文件流文件流的構(gòu)造方法:FileInputStream(Stringname)打開一個(gè)文件路徑名為name的文件作為輸入。FileOutputStream(Stringname)創(chuàng)建一個(gè)文件路徑名為name的文件作為輸出,文件如果已經(jīng)存在,則其內(nèi)容被清空。FileOutputStream(Stringname,booleanappend)創(chuàng)建一個(gè)文件路徑名為name的文件作為輸出,文件如果已經(jīng)存在,則在該輸出上輸出的內(nèi)容被接到原有內(nèi)容之后。CCIT軟件學(xué)院152.字節(jié)流——例子2把一個(gè)文件的內(nèi)容加到另一個(gè)文件后publicvoidcat(Stringfsrc,Stringfdest){try{InputStreamin=newFileInputStream(fsrc);OutputStreamout=

newFileOutputStream(fdest,true);copy(in,out);out.close();in.close();}catch(IOExceptionex){System.err.println(ex);}}CCIT軟件學(xué)院162.字節(jié)流——過濾流類FilterInputStream和FilterOutputStream分別對(duì)其他輸入/輸出流進(jìn)行特殊處理,它們?cè)谧x/寫數(shù)據(jù)的同時(shí)可以對(duì)數(shù)據(jù)進(jìn)行特殊處理。另外還提供了同步機(jī)制,使得某一時(shí)刻只有一個(gè)線程可以訪問一個(gè)輸入/輸出流。類FilterInputStream和FilterOutputStream分別重寫了父類InputStream和OutputStream的所有方法,同時(shí),它們的子類也應(yīng)該重寫它們的方法以滿足特定的需要。要使用過濾流,首先必須把它連接到某個(gè)輸入/輸出流上,通常在構(gòu)造方法的參數(shù)中指定所要連接的流:FilterInputStream(InputStreamin);FilterOutputStream(OutputStreamout);這兩個(gè)類是抽象類,構(gòu)造方法也是保護(hù)方法。CCIT軟件學(xué)院172.字節(jié)流——過濾流:緩沖流類BufferedInputStream和BufferedOutputStream實(shí)現(xiàn)了帶緩沖的過濾流,它提供了緩沖機(jī)制,把任意的I/O流“捆綁”到緩沖流上,可以提高讀寫效率。在初始化時(shí),除了要指定所連接的I/O流之外,還可以指定緩沖區(qū)的大小。缺省大小的緩沖區(qū)適合于通常的情形;最優(yōu)的緩沖區(qū)大小常依賴于主機(jī)操作系統(tǒng)、可使用的內(nèi)存空間以及機(jī)器的配置等;一般緩沖區(qū)的大小為內(nèi)存頁或磁盤塊等地整數(shù)倍,如8912字節(jié)或更小。BufferedInputStream(InputStreamin[,intsize])BufferedOutputStream(OutputStreamout[,intsize])CCIT軟件學(xué)院182.字節(jié)流——例子3使用緩沖流支持的mark和reset機(jī)制publicStringreadLine(BufferedInputStreamin)throwsIOException{StringBuffersb=newStringBuffer();intc=in.read();……

returnsb.toString();}while(c!=-1){if(c==‘\n’)break;if(c==‘\r’){in.mark(1);if(in.read()!=‘\n’)in.reset();break;}

sb.append((char)c);c=in.read();}CCIT軟件學(xué)院192.字節(jié)流——過濾流:緩沖流對(duì)于BufferedOutputStream,只有緩沖區(qū)滿時(shí),才會(huì)將數(shù)據(jù)真正送到輸出流,但可以使用flush()方法人為地將尚未填滿的緩沖區(qū)中的數(shù)據(jù)送出。publicvoidcopy(InputStreamin,OutputStreamout)throwsIOException{

out=newBufferedOutputStream(out,4096);byte[]buf=newbyte[4096];intlen=in.read(buf);while(len!=-1){out.write(buf,0,len);len=in.read(buf);}

out.flush();}CCIT軟件學(xué)院202.字節(jié)流——DataInputbooleanreadBoolean()bytereadByte()shortreadShort()charreadChar()intreadInt()longreadLong()doublereadDouble()floatreadFloat()intreadUnsignedByte()intreadUnsignedShort()CCIT軟件學(xué)院212.字節(jié)流——DataInputvoidreadFully(byte[]b)讀滿字節(jié)數(shù)組,不同于InputStream.readvoidreadFully(byte[]b,intoff,intlen)讀滿指定長(zhǎng)度,不同于InputStream.readintskipBytes(intn)與InputStream.skip等價(jià)StringreadUTF()安類UTF-8形式從輸入中讀取字符串StringreadLine()按回車(\r)換行(\n)為分割符讀取一行字符串不完全支持UNICODECCIT軟件學(xué)院222.字節(jié)流——DataOutputvoidwriteBoolean(booleanv)voidwriteByte(intv)voidwriteShort(intv)voidwriteChar(intv)voidwriteInt(intv)voidwriteLong(longv)voidwriteFloat(floatv)voidwriteDouble(doublev)CCIT軟件學(xué)院232.字節(jié)流——DataOutputvoidwrite(byte[]b)與OutputStream.write同義voidwrite(byte[]b,intoff,intlen)與OutputStream.write同義voidwrite(intb)與OutputStream.write同義voidwriteBytes(Strings)只輸出每個(gè)字符的低8位;不完全支持UNICODE。voidwriteChars(Strings)每個(gè)字符在輸出中都占兩個(gè)字節(jié)。CCIT軟件學(xué)院242.字節(jié)流——過濾流:數(shù)據(jù)流DataInputStream和DataOutputStream在提供了字節(jié)流的讀寫手段的同時(shí),以統(tǒng)一的通用的形式向輸入流中寫入boolean,int,long,double等基本數(shù)據(jù)類型,并可以在次把基本數(shù)據(jù)類型的值讀取回來。提供了字符串讀寫的手段。分別實(shí)現(xiàn)了DataInput和DataOutput接口CCIT軟件學(xué)院252.字節(jié)流——例子4FileOutputStreamfos=newFileOutputStream(“a.txt”);DataOutputStreamdos=newDataOutputStream(fos);dos.writeBoolean(true);dos.writeByte((byte)123);dos.writeChar('J');dos.writeDouble(3.141592654);dos.writeFloat(2.7182f);dos.writeInt(1234567890);dos.writeLong(998877665544332211L);dos.writeShort((short)11223);dos.writeUTF(“字符串”);dos.close();CCIT軟件學(xué)院262.字節(jié)流——例子4(續(xù))FileInputStreamfis=newFileInputStream("a.txt")DataInputStreamdis=newDataInputStream(fis);System.out.println(dis.readBoolean());System.out.println(dis.readByte());System.out.println(dis.readChar());System.out.println(dis.readDouble());System.out.println(dis.readFloat());System.out.println(dis.readInt());System.out.println(dis.readLong());System.out.println(dis.readShort());System.out.println(dis.readUTF());dis.close();CCIT軟件學(xué)院272.字節(jié)流——過濾流:其它LineNumberInputStream:主要用于對(duì)文本文件的處理,提供了行號(hào)控制功能。已經(jīng)被LineNumberReader取代PushBackInputStream:它提供了一個(gè)方法將剛剛讀入的一個(gè)或多個(gè)字節(jié)退回到輸入流中去。在編譯程序的詞法分析階段,經(jīng)常要超前讀入一個(gè)字節(jié)以界定當(dāng)前詞的屬性,然后再將該字節(jié)退回(因?yàn)橄旅娴奶幚砜赡苓€會(huì)用到該字節(jié))。PrintStream:其作用是將Java語言中的不同類型的數(shù)據(jù)以字符表示形式輸出到相應(yīng)的輸出流中去。不產(chǎn)生異常??勺詣?dòng)flush。通過checkError()檢查錯(cuò)誤。CCIT軟件學(xué)院282.字節(jié)流——標(biāo)準(zhǔn)流語言包java.lang中的System類管理標(biāo)準(zhǔn)輸入/輸出流和錯(cuò)誤流。System.in,從InputStream中繼承而來,用于從標(biāo)準(zhǔn)輸入設(shè)備中獲取輸入數(shù)據(jù)(通常是鍵盤)。System.out,從PrintStream中繼承而來,把輸出送到缺省的顯示設(shè)備(通常是顯示器)。System.err,也是從PrintStream中繼承而來,把錯(cuò)誤信息送到缺省的顯示設(shè)備(通常是顯示器)。每當(dāng)main方法被執(zhí)行時(shí),就自動(dòng)生成上述三個(gè)對(duì)象。CCIT軟件學(xué)院292.字節(jié)流——例子5publicstaticvoidmain(Stringargs[]){try{bytebArray[]=newbyte[128];Stringstr;System.out.println(“Pleaseentersomething:");System.in.read(bArray);str=newString(bArray);System.out.print("Youentered:");System.out.println(str);}catch(IOExceptionioe){System.err.println(ioe.toString());}}CCIT軟件學(xué)院302.字節(jié)流——對(duì)象流對(duì)象的持續(xù)性(Persistence)能夠紀(jì)錄自己的狀態(tài)一邊將來再生的能力,叫對(duì)象的持續(xù)性。對(duì)象的串行化(Serialization)對(duì)象通過寫出描述自己狀態(tài)的的數(shù)值來記錄自己的過程叫串行化。串行化的主要任務(wù)是寫出對(duì)象實(shí)例變量的數(shù)值,如果變量是另一個(gè)對(duì)象的引用,則引用的對(duì)象也要串行化。這個(gè)過程是遞歸的。對(duì)象流能夠輸入輸出對(duì)象的流稱為對(duì)象流??梢詫?duì)象串行化后通過對(duì)象輸入輸出流寫入文件或傳送到其它地方。CCIT軟件學(xué)院312.字節(jié)流——對(duì)象流在java中,允許可串行化的對(duì)象在通過對(duì)象流進(jìn)行傳輸。只有實(shí)現(xiàn)Serializable接口的類才能被串行化,Serializable接口中沒有任何方法,當(dāng)一個(gè)類聲明實(shí)現(xiàn)Serializable接口時(shí),只是表明該類加入對(duì)象串行化協(xié)議。publicclassStudentimplementsSerializable{intid;Stringname;intage;Stringdepartment;

transientintnumber;//第幾個(gè)對(duì)象實(shí)例

staticintcount;//創(chuàng)建對(duì)象實(shí)例的計(jì)數(shù)器}CCIT軟件學(xué)院322.字節(jié)流——對(duì)象流

要串行化一個(gè)對(duì)象,必須與一定的對(duì)象輸出/輸入流聯(lián)系起來,通過對(duì)象輸出流將對(duì)象狀態(tài)保存下來(將對(duì)象保存到文件中,或者通過網(wǎng)絡(luò)傳送到其他地方),再通過對(duì)象輸入流將對(duì)象狀態(tài)恢復(fù)。類ObjectOutputStream和ObjectInputStream分別繼承了接口ObjectOutput和ObjectInput,將數(shù)據(jù)流功能擴(kuò)展到可以讀寫對(duì)象,前者用writeObject()方法可以直接將對(duì)象保存到輸出流中,而后者用readObject()方法可以直接從輸入流中讀取一個(gè)對(duì)象。CCIT軟件學(xué)院332.字節(jié)流——例子6publicclassObjectser{publicstaticvoidmain(Stringargs[]){Studentstu=newStudent(981036,“LiMing”,16,“CSD”);try{FileOutputStreamfo=newFileOutputStream(“data.ser”);ObjectOutputStreamso=newObjectOutputStream(fo);so.writeObject(stu);so.close();}catch(Exceptione){System.err.println(e);}}}CCIT軟件學(xué)院342.字節(jié)流——例子6(續(xù))publicclassObjectRecov{publicstaticvoidmain(Stringargs[]){Studentstu;try{FileInputStreamfi=newFileInputStream(“data.ser”);ObjectInputStreamsi=newObjectInputStream(fi);stu=(Student)si.readObject();si.close();}catch(Exceptione){System.out.println(e);}System.out.println(“ID:”+stu.id+“name:”++“age:”+age+“dept.:”+stu.department);}}CCIT軟件學(xué)院352.字節(jié)流——對(duì)象流定制對(duì)象的串行化:在類定義中重寫readObject()和WriteObject()方法。privatevoidwriteObject(ObjectOutputStreamout)throwsIOException{out.writeInt(id);

…//out.defaultWriteObject()}privatevoidreadObject(ObjectInputStreamin)throwsIOException{id=in.readInt();

…//out.defaultReadObject()}CCIT軟件學(xué)院362.字節(jié)流——對(duì)象流SerializableExternalizablevoidreadExternal(ObjectInputin)voidwriteExternal(ObjectOutputout)ObjectInputObjectOutputCCIT軟件學(xué)院372.字節(jié)流——管道流管道用來把一個(gè)程序、線程和代碼塊的輸出連接到另一個(gè)程序、線程和代碼塊的輸入。java.io中提供了類PipedInputStream和PipedOutputStream作為管道的輸入/輸出流。管道輸入流作為一個(gè)通信管道的接收端,管道輸出流則作為發(fā)送端。管道流必須是輸入輸出并用,即在使用管道前,兩者必須進(jìn)行連接。輸出流輸入流CCIT軟件學(xué)院382.字節(jié)流——管道流管道輸入/輸出流可以用兩種方式進(jìn)行連接:在構(gòu)造方法中進(jìn)行連接PipedInputStream(PipedOutputStreampos);PipedOutputStream(PipedInputStreampis);通過各自的connect()方法連接在類PipedInputStream中,

connect(PipedOutputStreampos);在類PipedOutputStream中,

connect(PipedInputStreampis);CCIT軟件學(xué)院392.字節(jié)流——內(nèi)存流為了支持在內(nèi)存上的I/O,java.io中提供了類ByteArrayInputStreamByteArrayOutputStreamStringBufferInputStreamByteArrayInputStream可以從指定的字節(jié)數(shù)組中讀取數(shù)據(jù)。ByteArrayOutputStream中提供了緩沖區(qū)可以存放數(shù)據(jù)(緩沖區(qū)大小可以在構(gòu)造方法中設(shè)定),可以用write()方法向其中寫入數(shù)據(jù),然后用toByteArray()方法將緩沖區(qū)中的有效字節(jié)寫到字節(jié)數(shù)組中去。size()方法可以知道寫入的字節(jié)數(shù);reset()可以丟棄所有內(nèi)容。StringBufferInputStream與ByteArrayInputStream相類似,不同點(diǎn)在于它是從字符緩沖區(qū)StringBuffer中讀取16位的Unicode數(shù)據(jù),而不是8位的字節(jié)數(shù)據(jù)。(已被StringReader取代)CCIT軟件學(xué)院402.字節(jié)流——內(nèi)存流ByteArrayInputStreamByteArrayInputStream(byte[]buf)ByteArrayInputStream(byte[]buf,intoffset,intlength)ByteArrayOutputStreamvoidreset():重寫內(nèi)容intsize():返回寫入的字節(jié)數(shù)byte[]toByteArray():以新分配的字節(jié)數(shù)組形式返回寫入的內(nèi)容StringtoString():以缺省字符編碼方式把內(nèi)容編程字符串返回StringtoString(Stringenc):以指定字符編碼方式返回字符串voidwriteTo(OutputStreamout):把內(nèi)容寫到另一個(gè)輸出流中CCIT軟件學(xué)院412.字節(jié)流——順序輸入流java.io中提供了類SequenceInputStream,使應(yīng)用程序可以將幾個(gè)輸入流順序連接起來,讓程序員看起來就像是一個(gè)比較長(zhǎng)的流一樣。順序輸入流提供了將多個(gè)不同的輸入流統(tǒng)一為一個(gè)輸入流的功能,這使得程序可能變得更加簡(jiǎn)潔。如:FileInputStreamf1=newFileInputStream(“file1.txt”);FileInputStreamf2=newFileInputStream(“file2.txt”);SequenceInputStreamfs=newSequenceInputStream(f1,f2);FileOutputStreamf3=newFileOutputStream(“file3.txt”);copy(fs,f3);f3.close();fs.close();CCIT軟件學(xué)院423.字符流前面說過,在JDK1.1之前,java.io包中的流只有普通的字節(jié)流(以byte為基本處理單位的流),這種流對(duì)于以16位的Unicode碼表示的字符流處理很不方便。從JDK1.1開始,java.io包中加入了專門用于字符流處理的類,它們是以Reader和Writer為基礎(chǔ)派生的一系列類。同類InputStream和OutputStream一樣,Reader和Writer也是抽象類,只提供了一系列用于字符流處理的接口。它們的方法與類InputStream和OutputStream類似,只不過其中的參數(shù)換成字符或字符數(shù)組。CCIT軟件學(xué)院433.字符流——Readervoidclose()voidmark(intreadAheadLimit)booleanmarkSupported():intread()intread(char[]cbuf)intread(char[]cbuf,intoff,intlen)booleanready()voidreset()longskip(longn)CCIT軟件學(xué)院443.字符流——Writervoidclose()voidflush()voidwrite(char[]cbuf)voidwrite(char[]cbuf,intoff,intlen)voidwrite(intc)voidwrite(Stringstr)voidwrite(Stringstr,intoff,intlen)CCIT軟件學(xué)院453.字符流——與字節(jié)流連用InputStreamReader和OutputStreamWriter是java.io包中用于處理字符流的最基本的類,用來在字節(jié)流和字符流之間作為中介。使用這兩者進(jìn)行字符處理時(shí),在構(gòu)造方法中應(yīng)指定一定的平臺(tái)規(guī)范,以便把以字節(jié)方式表示的流轉(zhuǎn)換為特定平臺(tái)上的字符表示。InputStreamReader(InputStreamin);//缺省規(guī)范InputStreamReader(InputStreamin,Stringenc);//指定規(guī)范encOutputStreamWriter(OutputStreamout);//缺省規(guī)范OutputStreamWriter(OutputStreamout,Stringenc);//指定規(guī)范encCCIT軟件學(xué)院463.字符流——編碼如果讀取的字符流不是來自本地時(shí)(比如網(wǎng)上某處與本地編碼方式不同的機(jī)器),那么在構(gòu)造字符輸入流時(shí)就不能簡(jiǎn)單地使用缺省編碼規(guī)范,而應(yīng)該指定一種統(tǒng)一的編碼規(guī)范“ISO8859_1”,這是一種映射到ASCII碼的編碼方式,能夠在不同平臺(tái)之間正確轉(zhuǎn)換字符。InputStreamReaderir=newInputStreamReader(is,“8859_1”);FileReader&FileWriter采用缺省編碼讀寫字符文件采用其它編碼處理字符文件時(shí),采用

newInputStreamReader(newFileInputStream(file),“編碼名”);CCIT軟件學(xué)院473.字符流——緩沖同樣的,為了提高字符流處理的效率,java.io中也提供了緩沖流BufferedReader和BufferedWriter。其構(gòu)造方法與BufferedInputStream和BufferedOutputStream相類似。另外,除了read()和write()方法外,它還提供了整行字符處理方法:publicStringreadLine():BufferedReader的方法,從輸入流中讀取一行字符,行結(jié)束標(biāo)志為‘\n’、‘\r’或兩者一起。publicvoidnewLine():BufferedWriter的方法,向輸出流中寫入一個(gè)行結(jié)束標(biāo)志,它不是簡(jiǎn)單的換行符‘\n’或‘\r’,而是系統(tǒng)定義的行隔離標(biāo)志(lineseparator)。CCIT軟件學(xué)院483.字符流——其它CharArrayReader&CharArrayWriter對(duì)字符數(shù)組進(jìn)行處理StringReader&StringWriter對(duì)字符串進(jìn)行處理FilterReader&FilterWriter過濾字符流PipedReader&PipedWriter管道字符流LineNumberReader行處理字符輸入流PrintWriter打印字符輸出流CCIT軟件學(xué)院494.隨機(jī)訪問文件File:以文件路徑名的形式代表一個(gè)文件FileDescriptor:代表一個(gè)打開文件的文件描述FileFilter&FilenameFilter:用于列出滿足條件的文件File.list(FilenameFilterfnf)File.listFiles(FileFilterff)FileDialog.setFilenameFilter(FilenameFilterfnf)FileInputStream&FileReader:順序讀文件FileOutputStream&FileWriter:順序?qū)懳募andomAccessFile:提供對(duì)文件的隨機(jī)訪問支持。CCIT軟件學(xué)院504.RandomAccessFile類RandomAccessFile則允許對(duì)文件內(nèi)容同時(shí)完成讀和寫操作,它直接繼承Object,并且同時(shí)實(shí)現(xiàn)了接口DataInput和DataOutput,提供了支持隨機(jī)文件操作的方法:DataInput和DataOutput中的方法readInt(),writeDouble()…intskipBytes(intn):將指針鄉(xiāng)下移動(dòng)若干字節(jié)length():返回文件長(zhǎng)度longgetFilePointer():返回指針當(dāng)前位置voidseek(longpos):將指針調(diào)到所需位置voidsetLength(longnewLength):設(shè)定文件長(zhǎng)度CCIT軟件學(xué)院514.RandomAccessFileRandomAccessFile(Filefile,Stringmode) RandomAccessFile(Stringname,Stringmode)mode的取值:“r”

只讀.任何寫操作都將拋出IOException?!皉w”

讀寫.文件不存在時(shí)會(huì)創(chuàng)建該文件,文件存在時(shí),原文件內(nèi)容不變,通過寫操作改變文件內(nèi)容?!皉ws”

同步讀寫.等同于讀寫,但是任何協(xié)操作的內(nèi)容都被直接寫入物理文件,包括文件內(nèi)容和文件屬性?!皉wd”

數(shù)據(jù)同步讀寫.等同于讀寫,但任何內(nèi)容寫操作都直接寫到物理文件,對(duì)文件屬性內(nèi)容的修改不是這樣。CCIT軟件學(xué)院524.RandomAccessFile——例子7publicstaticvoidmain(Stringargs[]){intdata_arr[]={12,31,56,23,27,1,43,65,4,99};try{RandomAccessFilerandf=newRandomAccessFile(“temp.dat”,“rw”);for(inti=0;i>data_arr.length;i++)randf.writeInt(data_arr[i]);for(inti=data_arr.length-1;i>=0;i--){randf.seek(i*4);System.out.println(randf.readInt());}randf.close();}catch(IOExceptione){System.out.println(“Fileaccesserror:“+e);}}CCIT軟件學(xué)院534.文件操作——FileFile(Stringpathname)Filef=newFile(“c:\data\temp.dat”);Filef=newFile(“data\temp.dat”);Filef=newFile(“temp.dat”);File(Stringparent,Stringchild)Filef=newFile(“c:\data”,“temp.dat”);Filef=newFile(“data”,“temp.dat”);File(Fileparent,Stringchild)Filef=newFile(newFile(“c:\data”),“temp.dat”);Filef=newFile(newFile(“data”),“temp.dat”);CCIT軟件學(xué)院544.文件操作——File(1of4)booleancanRead()booleancanWrite()booleansetReadOnly()booleanexists()booleanisDirectory()booleanisFile()booleanisHidden()longlastModified()

溫馨提示

  • 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. 人人文庫(kù)網(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)論