版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第五講第五講 輸入輸入/輸出處理輸出處理n I/O流概述流概述n 字節(jié)流字節(jié)流n 字節(jié)流的基類(lèi)字節(jié)流的基類(lèi)n 文件流文件流n 過(guò)濾流過(guò)濾流n 標(biāo)準(zhǔn)流標(biāo)準(zhǔn)流n 字符流字符流n文件操作文件操作/隨機(jī)訪問(wèn)文件隨機(jī)訪問(wèn)文件n 對(duì)象流對(duì)象流n 管道流管道流n 內(nèi)存讀寫(xiě)流內(nèi)存讀寫(xiě)流n 順序輸入流順序輸入流1、I/O流概述流概述 大部分程序都需要輸入/輸出處理,比如從鍵盤(pán)讀取數(shù)據(jù)、向屏幕中輸出數(shù)據(jù)、從文件中讀或者向文件中寫(xiě)數(shù)據(jù)、在一個(gè)網(wǎng)絡(luò)連接上進(jìn)行讀寫(xiě)操作等。在Java中,把這些不同類(lèi)型的輸入、輸出源抽象為流(Stream),而其中輸入或輸出的數(shù)據(jù)則稱(chēng)為數(shù)據(jù)流(Data Stream),用統(tǒng)一的接口來(lái)表示,
2、從而使程序設(shè)計(jì)簡(jiǎn)單明了。文件文件程序程序終端終端文件文件程序程序網(wǎng)絡(luò)端點(diǎn)網(wǎng)絡(luò)端點(diǎn)數(shù)據(jù)流數(shù)據(jù)流起起點(diǎn)點(diǎn)終終點(diǎn)點(diǎn) 網(wǎng)絡(luò)端點(diǎn)網(wǎng)絡(luò)端點(diǎn)文件文件,字符串字符串存儲(chǔ)區(qū)存儲(chǔ)區(qū)1、I/O流概述流概述 流一般分為輸入流(Input Stream)和輸出流(Output Stream)兩類(lèi),但這種劃分并不是絕對(duì)的。比如一個(gè)文件,當(dāng)向其中寫(xiě)數(shù)據(jù)時(shí),它就是一個(gè)輸出流;當(dāng)從其中讀取數(shù)據(jù)時(shí),它就是一個(gè)輸入流。當(dāng)然,鍵盤(pán)只是一個(gè)輸入流,而屏幕則只是一個(gè)輸出流。 在Java開(kāi)發(fā)環(huán)境中,主要是由包java.io中提供的一系列的類(lèi)和接口來(lái)實(shí)現(xiàn)輸入/輸出處理。標(biāo)準(zhǔn)輸入/輸出處理則是由包java.lang中提供的類(lèi)來(lái)處理的,但這些類(lèi)
3、又都是從包java.io中的類(lèi)繼承而來(lái)。輸入流:數(shù)據(jù)提供者,可從中讀取數(shù)據(jù)出來(lái)輸入流:數(shù)據(jù)提供者,可從中讀取數(shù)據(jù)出來(lái)輸出流:數(shù)據(jù)接收者,可往其中寫(xiě)數(shù)據(jù)輸出流:數(shù)據(jù)接收者,可往其中寫(xiě)數(shù)據(jù)1、I/O流概述流概述 在JDK1.1之前,java.io包中的流只有普通的字節(jié)流字節(jié)流(以byte為基本處理單位的流),這種流對(duì)于以16位的Unicode碼表示的字符流處理很不方便。 從JDK1.1開(kāi)始, java.io包中加入了專(zhuān)門(mén)用于字符流字符流處理的類(lèi)(以Reader和Writer為基礎(chǔ)派生的一系列類(lèi))。 另外,為了使對(duì)象的狀態(tài)能夠方便地永久保存下來(lái), JDK1.1以后的java.io包中提供了以字節(jié)流為
4、基礎(chǔ)的用于對(duì)象的永久化保存狀態(tài)的機(jī)制對(duì)象流對(duì)象流(通過(guò)實(shí)現(xiàn)ObjectInput和ObjectOutput接口)。nInputStream nByteArrayInputStream nFileInputStream nFilterInputStream nBufferedInputStream nDataInputStreamnLineNumberInputStream nPushbackInputStreamnObjectInputStreamnPipedInputStream nSequenceInputStream nStringBufferInputStreamnOutputStre
5、amnByteArrayOutputStreamnFileOutputStreamnFilterOutputStreamnBufferedOutputStreamnDataOutputStreamnPrintStreamnObjectOutputStreamnPipedOutputStream1、I/O流概述流概述字節(jié)流字節(jié)流nReadernBufferedReadernLineNumberReadernCharArrayReadernFilterReadernPushbackReadernInputStreamReadernFileReadernPipedReadernStringReade
6、rnWriternBufferedWriternCharArrayWriternFilterWriternOutputStreamWriternFileWriternPipedWriternStringWriternPrintWriter1、I/O流概述流概述字符流字符流nDataInputnObjectInputnDataOutputnObjectOutputnFileFilternFilenameFilternObjectInputValidationnObjectStreamConstantsnSerializablenExternalizablenFilenFileDescriptor
7、nRandomAccessFile njava.awt.FileDialog1、I/O流概述流概述I/O接口接口 與與 文件操作文件操作java.io類(lèi)詳解類(lèi)詳解2、字節(jié)流、字節(jié)流基類(lèi):基類(lèi):InputStream Java中每一種字節(jié)流的基本功能依賴(lài)于基本類(lèi)InputStream和OutputStream,它們是抽象類(lèi)抽象類(lèi),不能直接使用。 屬于InputStream類(lèi)的方法有:n read():從流中讀入數(shù)據(jù)n skip():跳過(guò)流中若干字節(jié)數(shù)n available():返回流中可用字節(jié)數(shù)n mark():在流中標(biāo)記一個(gè)位置n reset():返回標(biāo)記過(guò)的位置n markSupport()
8、:是否支持標(biāo)記和復(fù)位操作n close():關(guān)閉流 在InputStream類(lèi)中,方法read()提供了三種從流中讀數(shù)據(jù)的方法:n int read():從輸入流中讀一個(gè)字節(jié),形成一個(gè)0255之間的整數(shù)返回(是一個(gè)抽象方法)。n int read(byte b):讀多個(gè)字節(jié)到數(shù)組中,填滿(mǎn)整個(gè)數(shù)組。n int read(byte b, int off, int len):從輸入流中讀取長(zhǎng)度為len的數(shù)據(jù),寫(xiě)入數(shù)組b中從索引off開(kāi)始的位置,并返回讀取得字節(jié)數(shù)。 對(duì)于這三個(gè)方法,若返回對(duì)于這三個(gè)方法,若返回1,表明流結(jié)束,否,表明流結(jié)束,否則,返回實(shí)際讀取的字節(jié)數(shù)。則,返回實(shí)際讀取的字節(jié)數(shù)。2、字
9、節(jié)流、字節(jié)流基類(lèi):基類(lèi):InputStream 屬于OutputStream類(lèi)的方法有:n write(int b):將一個(gè)整數(shù)輸出到流中(只輸出低位字節(jié),為抽象方法為抽象方法)n write(byte b):將字節(jié)數(shù)組中的數(shù)據(jù)輸出到流中n write(byte b, int off, int len):將數(shù)組b中從off指定的位置開(kāi)始,長(zhǎng)度為len的數(shù)據(jù)輸出到流中n flush():刷空輸出流,并將緩沖區(qū)中的數(shù)據(jù)強(qiáng)制送出n close():關(guān)閉流Writer的方法: write(String s), write(String s, int off, int len)2、字節(jié)流、字節(jié)流基類(lèi):基
10、類(lèi):OutputStreamn把輸入流中的所有內(nèi)容復(fù)制到輸出流中public void copy(InputStream in, OutputStream out) throws IOException byte buf = new byte4096; int len = in.read(buf); while (len != -1) out.write(buf, 0, len); len = in.read(buf); 2、字節(jié)流、字節(jié)流基類(lèi):例子基類(lèi):例子2、字節(jié)流、字節(jié)流各種字節(jié)流各種字節(jié)流q文件流q過(guò)濾流:緩沖流、數(shù)據(jù)流、其他過(guò)慮流q標(biāo)準(zhǔn)流q對(duì)象流q管道流q內(nèi)存流q 順序輸入流2、字節(jié)
11、流、字節(jié)流文件流文件流在I/O處理中,最常見(jiàn)的就是對(duì)文件的操作。java.io包中所提供的文件操作類(lèi)包括:FileInputStream:FileOutputStream:File:FileDescriptor:FilenameFilter:接口,主要用于實(shí)現(xiàn)文件名查找模式的匹配。RandomAccessFile:提供對(duì)本地文件系統(tǒng)對(duì)本地文件系統(tǒng)中文件的隨機(jī)訪問(wèn)支持。描述本地文件系統(tǒng)本地文件系統(tǒng)中的文件或目錄用于讀寫(xiě)本地文件系統(tǒng)寫(xiě)本地文件系統(tǒng)中的文件2、字節(jié)流、字節(jié)流文件流:文件流:FileInputStream/ FileOutputStreamq FileInputStream類(lèi)用來(lái)打開(kāi)一
12、個(gè)輸入文件,若要打開(kāi)的文件不存在,則會(huì)產(chǎn)生例外FileNotFoundException,這是一個(gè)非運(yùn)行時(shí)例外,必須捕獲或聲明拋棄;q FileOutputStream類(lèi)用來(lái)打開(kāi)一個(gè)輸出文件,若要打開(kāi)的文件不存在,則會(huì)創(chuàng)建一個(gè)新的文件,否則原文件的內(nèi)容會(huì)被新寫(xiě)入的內(nèi)容所覆蓋。q 在進(jìn)行文件的讀/寫(xiě)操作時(shí),會(huì)產(chǎn)生非運(yùn)行時(shí)例外IOException,必須捕獲或聲明拋棄(其它的輸入/輸出流處理時(shí)也同樣需要進(jìn)行輸入/輸出例外處理)。2、字節(jié)流、字節(jié)流文件流:文件流:FileInputStream/ FileOutputStreamn文件流的構(gòu)造方法:nFileInputStream(File f) n
13、打開(kāi)一個(gè)以f描述的文件作為輸入。nFileInputStream(String name) n打開(kāi)一個(gè)文件路徑名為name的文件作為輸入。nFileOutputStream(File f) n創(chuàng)建一個(gè)以f描述的文件作為輸出,文件如果已經(jīng)存在,則其內(nèi)容被清空。nFileOutputStream(String name) n創(chuàng)建一個(gè)文件路徑名為name的文件作為輸出,文件如果已經(jīng)存在,則其內(nèi)容被清空。nFileOutputStream(String name, boolean append) n創(chuàng)建一個(gè)文件路徑名為name的文件作為輸出,文件如果已經(jīng)存在,則在該輸出上輸出的內(nèi)容被接到原有內(nèi)容之后。
14、 File f1 = new File(“file1.txt”); File f2 = new File(“file2.txt”); FileInputStream in=new FileInputStream(f1); FileOutputStream out=new FileOutputStream(f2); FileOutputStream out=new FileOutputStream(“file3.txt”);輸入流的參數(shù)是用于指定輸入的文件名,輸出流的參數(shù)則是用于指定輸出的文件名。輸出文件輸出文件輸入文件輸入文件readwrite2、字節(jié)流、字節(jié)流文件流:文件流:FileInpu
15、tStream/ FileOutputStream2、字節(jié)流、字節(jié)流 文件流:例子文件流:例子1 import java.io.*; class Filestream public static void main(String args) try File inFile=new File(file1.txt); File outFile=new File(file2.txt); FileInputStream fis=new FileInputStream(inFile); FileOutputStream fos=new FileOutputStream(outFile); int c;
16、while(c=fis.read()!=-1) fos.write(c); fis.close(); fos.close(); catch(FileNotFoundException e) System.out.println(FileStreamsTest: +e); catch(IOException e) System.err.println(FileStreamsTest: +e); 將一個(gè)文件復(fù)制到另一個(gè)文件中(覆蓋)將一個(gè)文件復(fù)制到另一個(gè)文件中(覆蓋)n把一個(gè)文件的內(nèi)容加到另一個(gè)文件后把一個(gè)文件的內(nèi)容加到另一個(gè)文件后public void cat(String fsrc, Stri
17、ng fdest) try InputStream in = new FileInputStream(fsrc); OutputStream out = new FileOutputStream(fdest, true); copy(in, out); out.close(); in.close(); catch (IOException ex) System.err.println(ex); 2、字節(jié)流、字節(jié)流 文件流:例子文件流:例子22、字節(jié)流、字節(jié)流過(guò)濾流過(guò)濾流 java.io中提供類(lèi)FilterInputStream和FilterOutputStream分別對(duì)其他輸入/輸出流進(jìn)行特殊
18、處理,它們?cè)谧x/寫(xiě)數(shù)據(jù)的同時(shí)可以對(duì)數(shù)據(jù)進(jìn)行特殊處理。另外還提供了同步機(jī)制,使得某一時(shí)刻只有一個(gè)線程可以訪問(wèn)一個(gè)輸入/輸出流。 類(lèi)FilterInputStream和FilterOutputStream分別重寫(xiě)了父類(lèi)InputStream和OutputStream的所有方法,同時(shí),它們的子類(lèi)也應(yīng)該重寫(xiě)它們的方法以滿(mǎn)足特定的需要。 要使用過(guò)濾流,首先必須把它連接到某個(gè)輸入要使用過(guò)濾流,首先必須把它連接到某個(gè)輸入/輸出流輸出流上上,通常在構(gòu)造方法的參數(shù)中指定所要連接的流: protected FilterInputStream(InputStream in); protected FilterOut
19、putStream(OutputStream out);2、字節(jié)流、字節(jié)流過(guò)濾流過(guò)濾流過(guò)濾流其他流2、字節(jié)流、字節(jié)流過(guò)濾流:緩沖流過(guò)濾流:緩沖流 類(lèi)BufferedInputStream和BufferedOutputStream實(shí)現(xiàn)了帶緩沖的過(guò)濾流,它提供了緩沖機(jī)制,把任意的I/O流“捆綁”到緩沖流上,可以提高該I/O流的讀取效率。 在初始化時(shí),除了要指定所連接的I/O流之外,還可以指定緩沖區(qū)的大小。缺省時(shí)是用32字節(jié)大小的緩沖區(qū);最優(yōu)的緩沖區(qū)大小常依賴(lài)于主機(jī)操作系統(tǒng)、可使用的內(nèi)存空間以及機(jī)器的配置等;一般緩沖區(qū)的大小為內(nèi)存頁(yè)或磁盤(pán)塊等的整數(shù)倍,如8912字節(jié)或更小。n BufferedInp
20、utStream(InputStream in, int size) n BufferedOutputStream(OutputStream out, int size) 2、字節(jié)流、字節(jié)流過(guò)濾流:緩沖流過(guò)濾流:緩沖流輸出流緩沖區(qū)write()輸入流緩沖區(qū)read() 將緩沖流與文件流相接:FileInputStream in = new FileInputStream(“file1.txt”);FileOutputStream out = new FileOutputStream (“file2.txt”);BufferedInputStream bin = new BufferedInpu
21、tStream(in,256) BufferedOutputStream bout = new BufferedOutputStream(out,256);int len;byte bArray=new byte256;len=bin.read(bArray); /len中得到的是實(shí)際讀取的長(zhǎng)度中得到的是實(shí)際讀取的長(zhǎng)度, bArray中得到的是數(shù)據(jù)中得到的是數(shù)據(jù)file1.txtfile2.txt輸入流輸入流輸出流輸出流輸入緩沖流輸入緩沖流輸出緩沖流輸出緩沖流文件文件文件流文件流緩沖流緩沖流2、字節(jié)流、字節(jié)流過(guò)濾流:緩沖流過(guò)濾流:緩沖流2、字節(jié)流、字節(jié)流過(guò)濾流:緩沖流過(guò)濾流:緩沖流n對(duì)于Buf
22、feredOutputStream,只有緩沖區(qū)滿(mǎn)時(shí),才會(huì)將數(shù)據(jù)真正送到輸出流,但可以使用flush()方法人為地將尚未填滿(mǎn)的緩沖區(qū)中的數(shù)據(jù)送出。public void copy(InputStream in, OutputStream out) throws IOException out = new BufferedOutputStream(out, 4096); byte buf = new byte4096; int len = in.read(buf); while (len != -1) out.write(buf, 0, len); len = in.read(buf); out.
23、flush(); /最后一次讀取的數(shù)據(jù)可能不到4096字節(jié)n使用緩沖流支持的使用緩沖流支持的mark和和reset機(jī)制機(jī)制public String readLine( BufferedInputStream in) throws IOException StringBuffer sb = new StringBuffer(); int c = in.read(); return sb.toString();while (c != -1) if (c = n) break; if (c = r) in.mark(1); if (in.read() != n) in.reset(); break
24、; sb.append(char)c); c = in.read();2、字節(jié)流、字節(jié)流過(guò)濾流:緩沖流(例子)過(guò)濾流:緩沖流(例子)2、字節(jié)流、字節(jié)流過(guò)濾流:數(shù)據(jù)流過(guò)濾流:數(shù)據(jù)流接口接口DataInput和和DataOutput,設(shè)計(jì)了一種較為高級(jí)的數(shù)據(jù)輸入輸出方式:除了可處理字節(jié)和字節(jié)數(shù)組外,還可以處理int、float、boolean等基本數(shù)據(jù)類(lèi)型,這些數(shù)據(jù)在文件中的表示方式和它們?cè)趦?nèi)存中的一樣,無(wú)須轉(zhuǎn)換,如read(), readInt(), readByte() ;write(), writeChar(), writeBoolean()。此外,還可以用readLine()方法讀取一行信
25、息。2、字節(jié)流、字節(jié)流過(guò)濾流:數(shù)據(jù)流(過(guò)濾流:數(shù)據(jù)流(DataInput)nboolean readBoolean() nbyte readByte() nshort readShort() nchar readChar() nint readInt() nlong readLong() ndouble readDouble() nfloat readFloat() nint readUnsignedByte() nint readUnsignedShort()2、字節(jié)流、字節(jié)流過(guò)濾流:數(shù)據(jù)流(過(guò)濾流:數(shù)據(jù)流(DataInput)nvoid readFully(byte b) n讀滿(mǎn)字節(jié)數(shù)組,
26、不同于InputStream.readnvoid readFully(byte b, int off, int len) n讀滿(mǎn)指定長(zhǎng)度,不同于InputStream.readnint skipBytes(int n) n與InputStream.skip等價(jià)nString readUTF() n安類(lèi)UTF-8形式從輸入中讀取字符串nString readLine()n按回車(chē)(r)換行(n)為分割符讀取一行字符串n不完全支持UNICODE2、字節(jié)流、字節(jié)流過(guò)濾流:數(shù)據(jù)流(過(guò)濾流:數(shù)據(jù)流(DataOutput)nvoid writeBoolean(boolean v) nvoid writeBy
27、te(int v) nvoid writeShort(int v) nvoid writeChar(int v)nvoid writeInt(int v) nvoid writeLong(long v) nvoid writeFloat(float v) nvoid writeDouble(double v) 2、字節(jié)流、字節(jié)流過(guò)濾流:數(shù)據(jù)流(過(guò)濾流:數(shù)據(jù)流(DataOutput)nvoid write(byte b) n與OutputStream.write同義nvoid write(byte b, int off, int len) n與OutputStream.write同義nvoid
28、write(int b) n與OutputStream.write同義nvoid writeBytes(String s) n只輸出每個(gè)字符的低8位;不完全支持UNICODE。nvoid writeChars(String s) n每個(gè)字符在輸出中都占兩個(gè)字節(jié)。2、字節(jié)流、字節(jié)流過(guò)濾流:數(shù)據(jù)流過(guò)濾流:數(shù)據(jù)流n數(shù)據(jù)流類(lèi) DataInputStream和DataOutputStream的處理對(duì)象除了是字節(jié)或字節(jié)數(shù)組外,還可以實(shí)現(xiàn)對(duì)文件的不同數(shù)據(jù)類(lèi)型的讀寫(xiě):n分別實(shí)現(xiàn)了DataInput和DataOutput接口n在提供了字節(jié)流的讀寫(xiě)手段的同時(shí),n以統(tǒng)一的通用的形式向輸入流中寫(xiě)入boolean,in
29、t,long,double等基本數(shù)據(jù)類(lèi)型,并可以在次把基本數(shù)據(jù)類(lèi)型的值讀取回來(lái)。n提供了字符串讀寫(xiě)的手段。 數(shù)據(jù)流可以連接一個(gè)已經(jīng)建立好的數(shù)據(jù)對(duì)象,例如網(wǎng)絡(luò)的連結(jié)、文件等。數(shù)據(jù)流可通過(guò)如下方式建立:FileInputStream fis = new FileInputStream(file1.txt);FileOutputStream fos = new FileOutputStream(file2.txt);DataInputStream dis = new DataInputStream(fis);DataOutputStream dos = new DataOutputStream(fo
30、s);2、字節(jié)流、字節(jié)流過(guò)濾流:數(shù)據(jù)流過(guò)濾流:數(shù)據(jù)流class DataStream public static void main(String args) throws IOException FileOutputStream fos = new FileOutputStream(“a.txt”); DataOutputStream dos = new DataOutputStream (fos); try dos.writeBoolean(true); dos.writeByte(byte)123); dos.writeChar(J); dos.writeDouble(3.1415926
31、54); dos.writeFloat(2.7182f); dos.writeInt(1234567890); dos.writeLong(998877665544332211L); dos.writeShort(short)11223); finally dos.close(); 過(guò)濾流:數(shù)據(jù)流(例子過(guò)濾流:數(shù)據(jù)流(例子1)FileInputStream fis = new FileInputStream(a.txt);DataInputStream dis = new DataInputStream(fis);try System.out.println(t +dis.readBoolea
32、n(); System.out.println(t +dis.readByte(); System.out.println(t +dis.readChar(); System.out.println(t +dis.readDouble(); System.out.println(t +dis.readFloat(); System.out.println(t +dis.readInt(); System.out.println(t +dis.readLong(); System.out.println(t +dis.readShort();finally dis.close(); /main(
33、)/class DataStream過(guò)濾流:數(shù)據(jù)流(例子過(guò)濾流:數(shù)據(jù)流(例子1)/利用方法利用方法readLine()計(jì)算一個(gè)輸入流中的字符數(shù)和行數(shù)計(jì)算一個(gè)輸入流中的字符數(shù)和行數(shù)/ (適合于文本文件)(適合于文本文件)int DataLine(InputStream in) DataInputStream data = new DataInputStream(in); String currentLine; int lineCount=0; int charCount=0; while(currentLine=data.readLine()!=null) +lineCount; charCou
34、nt += currentLine.length(); return (charCount/(float)lineCount);2、字節(jié)流、字節(jié)流過(guò)濾流:數(shù)據(jù)流(例子過(guò)濾流:數(shù)據(jù)流(例子2)2、字節(jié)流、字節(jié)流過(guò)濾流:其他過(guò)濾流過(guò)濾流:其他過(guò)濾流LineNumberInputStream:主要用于對(duì)文本文件的處理,提供了行號(hào)控制功能。n已經(jīng)被LineNumberReader取代PushBackInputStream:在編譯程序的詞法分析階段,經(jīng)常要超前讀入一個(gè)字節(jié)以界定當(dāng)前詞的屬性,然后再將該字節(jié)退回(因?yàn)橄旅娴奶幚砜赡苓€會(huì)用到該字節(jié))。 PushBackInputStream就提供了這樣的能力
35、,它提供了一個(gè)方法將剛剛讀入的字節(jié)退回到輸入流中去。PrintStream:其作用是將Java語(yǔ)言中的不同類(lèi)型的數(shù)據(jù)以字符表示形式輸出到相應(yīng)的輸出流中去。n不產(chǎn)生異常。可自動(dòng)flush。通過(guò)checkError()檢查錯(cuò)誤。2、字節(jié)流、字節(jié)流標(biāo)準(zhǔn)流標(biāo)準(zhǔn)流 語(yǔ)言包java.lang中的System類(lèi)管理標(biāo)準(zhǔn)輸入/輸出流和錯(cuò)誤流。 System.in,從InputStream中繼承而來(lái),用于從標(biāo)準(zhǔn)輸入設(shè)備中獲取輸入數(shù)據(jù)(通常是鍵盤(pán))。 System.out,從PrintStream中繼承而來(lái),把輸出送到缺省的顯示設(shè)備(通常是顯示器)。 System.err,也是從PrintStream中繼承而來(lái),
36、把錯(cuò)誤信息送到缺省的顯示設(shè)備(通常是顯示器)。 每當(dāng)每當(dāng)main方法被執(zhí)行時(shí),就自動(dòng)生成上述三個(gè)對(duì)象。方法被執(zhí)行時(shí),就自動(dòng)生成上述三個(gè)對(duì)象。public class ReadFromKB public static void main(String args) try byte bArray=new byte128;String str;System.out.println(Enter something Using Keyborad:);System.in.read(bArray);str = new String(bArray, 0);System.out.print(You entere
37、d:);System.out.println(str); catch(IOException ioe) System.out.println(ioe.toString(); 過(guò)濾流:標(biāo)準(zhǔn)流(例子)過(guò)濾流:標(biāo)準(zhǔn)流(例子)從鍵盤(pán)中獲取數(shù)據(jù)從鍵盤(pán)中獲取數(shù)據(jù)2、字節(jié)流、字節(jié)流對(duì)象流對(duì)象流 對(duì)象的持續(xù)性(Persistence) 能夠紀(jì)錄自己的狀態(tài)以便將來(lái)再生的能力,叫對(duì)象的持續(xù)性。 對(duì)象的串行化(Serialization) 對(duì)象通過(guò)寫(xiě)出描述自己狀態(tài)的的數(shù)值來(lái)記錄自己的過(guò)程叫串行化。串行化的主要任務(wù)是寫(xiě)出對(duì)象實(shí)例變量實(shí)例變量的數(shù)值,如果變量是另一個(gè)對(duì)象的引用,則引用的對(duì)象也要串行化。這個(gè)過(guò)程是遞歸的。
38、n 對(duì)象流 能夠輸入輸出對(duì)象的流稱(chēng)為對(duì)象流。 可以將對(duì)象串行化后通過(guò)對(duì)象輸入輸出流寫(xiě)入文件或傳送到其它地方。 在Java中,允許可串行化的對(duì)象可串行化的對(duì)象在通過(guò)對(duì)象流進(jìn)行傳輸。只有實(shí)現(xiàn)Serializable接口的類(lèi)才能被串行化, Serializable接口中沒(méi)有任何方法,當(dāng)一個(gè)類(lèi)聲明實(shí)現(xiàn)Serializable接口時(shí),只是表明該類(lèi)加入對(duì)象串行化協(xié)議。public class Student implements Serializable int id; String name; int age; String department; public Student(int id, Stri
39、ng name, int age, String department) this.id=id; =name; this.age=age; this.department =department; 2、字節(jié)流、字節(jié)流對(duì)象流對(duì)象流 要串行化一個(gè)對(duì)象,必須與一定的對(duì)象輸出/輸入流聯(lián)系起來(lái),通過(guò)對(duì)象輸出流將對(duì)象狀態(tài)保存下來(lái)(將對(duì)象保存到文件中,或者通過(guò)網(wǎng)絡(luò)傳送到其他地方) ,再通過(guò)對(duì)象輸入流將對(duì)象狀態(tài)恢復(fù)。 類(lèi)ObjectOutputStream和ObjectInputStream分別繼承了接口ObjectOutput和ObjectInput,將數(shù)據(jù)流功能擴(kuò)展到可以讀寫(xiě)對(duì)象,前者用
40、writeObject()方法可以直接將對(duì)象保存到輸出流中,而后者用readObject()方法可以直接從輸入流中讀取一個(gè)對(duì)象。2、字節(jié)流、字節(jié)流對(duì)象流對(duì)象流2、字節(jié)流、字節(jié)流對(duì)象流對(duì)象流 從某種意義來(lái)看,對(duì)象流與數(shù)據(jù)流是相類(lèi)似的,也具有過(guò)濾流的特性。利用對(duì)象流來(lái)輸入/輸出對(duì)象時(shí),也不能單獨(dú)使用,需要與其他的流連接起來(lái)。q 對(duì)象是可串行化的q 使用對(duì)象流public class Objectser public static void main(String args) Student stu=new Student(981036, “Li Ming”, 16, “CSD”); try Fil
41、eOutputStream fo = new FileOutputStream(“data.ser”); ObjectOutputStream so = new ObjectOutputStream(fo); so.writeObject(stu); so.close(); catch(Exception e) System.out.println(e) ; 對(duì)象流:例子(對(duì)象的存儲(chǔ))對(duì)象流:例子(對(duì)象的存儲(chǔ))public class ObjectRecov public static void main(String args) Student stu; try FileInputStrea
42、m fi = new FileInputStream(“data.ser”); ObjectInputStream si = new ObjectInputStream(fi); stu = (Student)si.readObject(); si.close(); catch(Exception e) System.out.println(e); System.out.println(“ID: ”+stu.id+“name:”+ +“age:”+stu.age+“dept.:”+stu.department); 對(duì)象流:例子(對(duì)象的存儲(chǔ))對(duì)象流:例子(對(duì)象的存儲(chǔ))2、字節(jié)流、
43、字節(jié)流對(duì)象流對(duì)象流定制對(duì)象的串行化定制對(duì)象的串行化:當(dāng)一個(gè)對(duì)象串行化時(shí),如果希望該對(duì)象的某些屬性不被保存,可以通過(guò)在類(lèi)定義中重寫(xiě)readObject()和WriteObject()方法來(lái)實(shí)現(xiàn)。public class Student implements Serializable int id; String name; int age; String department; public Student(int id, String name, int age, String department) this.id=id; =name; this.age=age; this
44、.department =departmernt; private void writeObject(ObjectOutputStream out) throws IOException out.writeInt(id); / out.defaultWriteObject() private void readObject(ObjectInputStream in) throws IOException id = in.readInt(); / in.defaultReadObject() 定制對(duì)象的串行化定制對(duì)象的串行化 串行化只能保存對(duì)象的非靜態(tài)成員變量(實(shí)例變量)非靜態(tài)成員變量(實(shí)例變量
45、),而不能保存任何成員方法和靜態(tài)成員變量,并且保存的只是變量的值,對(duì)于變量的任何修飾符都不能保存。 對(duì)于某些類(lèi)型的對(duì)象,其狀態(tài)是瞬時(shí)的,這樣的對(duì)象是無(wú)法保存其狀態(tài)的,如Thread對(duì)象或流對(duì)象。對(duì)于這樣的成員變量,必須用transient關(guān)鍵字標(biāo)明,否則編譯器將報(bào)錯(cuò)。任何用transient關(guān)鍵字標(biāo)明的成員變量,都不會(huì)被保存。 另外,串行化可能涉及將對(duì)象存放到磁盤(pán)上或在網(wǎng)絡(luò)上發(fā)送數(shù)據(jù),這時(shí)會(huì)產(chǎn)生安全問(wèn)題。對(duì)于一些需要保密的數(shù)據(jù),不應(yīng)保存在永久介質(zhì)中(或者不應(yīng)簡(jiǎn)單地不加處理地保存下來(lái)),為了保證安全,應(yīng)在這些變量前加上transient關(guān)鍵字。2、字節(jié)流、字節(jié)流對(duì)象流對(duì)象流2、字節(jié)流、字節(jié)流管道
46、流管道流 管道用來(lái)把一個(gè)程序、線程和代碼塊的輸出連接到另一個(gè)程序、線程和代碼塊的輸入。java.io中提供了類(lèi)PipedInputStream和PipedOutputStream作為管道的輸入/輸出流。 管道輸入流作為一個(gè)通信管道的接收端,管道輸出流則作為發(fā)送端。管道流必須是輸入輸出流并用管道流必須是輸入輸出流并用,即在使用管道前,兩者必須進(jìn)行連接。輸出流輸出流輸入流輸入流數(shù)據(jù)流向字節(jié)流字節(jié)流管道流管道流管道輸入/輸出流可以用兩種方式進(jìn)行連接:1)在構(gòu)造方法中進(jìn)行連接PipedInputStream(PipedOutputStream pos);PipedOutputStream(PipedI
47、nputStream pis);2)通過(guò)各自的connect()方法連接在類(lèi)PipedInputStream中,connect(PipedOutputStream pos);在類(lèi)PipedOutputStream中,connect(PipedInputStream pis);class Pipedstream public static void main(String args) throws IOException byte aByteData1 = 123, aByteData2 = 111; PipedInputStream pis = new PipedInputStream();
48、PipedOutputStream pos = new PipedOutputStream(pis); System.out.println(PipedInputStream); try pos.write(aByteData1); pos.write(aByteData2); System.out.println(byte)pis.read(); System.out.println(byte)pis.read(); finally pis.close(); pos.close(); 將數(shù)據(jù)從輸出管道進(jìn),從輸入管道出將數(shù)據(jù)從輸出管道進(jìn),從輸入管道出管道流:例子管道流:例子2、字節(jié)流、字節(jié)流內(nèi)
49、存讀寫(xiě)流內(nèi)存讀寫(xiě)流n為了支持在內(nèi)存上的I/O,java.io中提供了類(lèi)nByteArrayInputStreamnByteArrayOutputStreamnStringBufferInputStreamnByteArrayInputStream可以從指定的字節(jié)數(shù)組中讀取數(shù)據(jù)。nByteArrayOutputStream中提供了緩沖區(qū)可以存放數(shù)據(jù)(緩沖區(qū)大小可以在構(gòu)造方法中設(shè)定,缺省為32),可以用write()方法向其中寫(xiě)入數(shù)據(jù),然后用toByteArray()方法將緩沖區(qū)中的有效字節(jié)寫(xiě)到字節(jié)數(shù)組中去。size()方法可以知道寫(xiě)入的字節(jié)數(shù);reset()可以丟棄所有內(nèi)容。nStringBuf
50、ferInputStream與ByteArrayInputStream相類(lèi)似,不同點(diǎn)在于它是從字符緩沖區(qū)StringBuffer中讀取16位的Unicode數(shù)據(jù),而不是8位的字節(jié)數(shù)據(jù)。 (已被(已被StringReader取代)取代)nByteArrayInputStreamnByteArrayInputStream(byte buf) nByteArrayInputStream(byte buf, int offset, int length) nByteArrayOutputStreamnvoid reset() :重寫(xiě)內(nèi)容nint size() :返回寫(xiě)入的字節(jié)數(shù)nbyte toByte
51、Array() :以新分配的字節(jié)數(shù)組形式返回寫(xiě)入的內(nèi)容nString toString() :以缺省字符編碼方式把內(nèi)容編程字符串返回nString toString(String enc) :以指定字符編碼方式返回字符串nvoid writeTo(OutputStream out) :把內(nèi)容寫(xiě)到另一個(gè)輸出流中2、字節(jié)流、字節(jié)流內(nèi)存讀寫(xiě)流內(nèi)存讀寫(xiě)流2、字節(jié)流、字節(jié)流順序輸入流順序輸入流 java.io中提供了類(lèi)SequenceInputStream,使應(yīng)用程序可以將幾個(gè)輸入流順序連接起來(lái),讓程序員看起來(lái)就像是一個(gè)比較長(zhǎng)的流一樣。順序輸入流提供了將多個(gè)不同的輸入流統(tǒng)一為一個(gè)輸入流的功能,這使得程序
52、可能變得更加簡(jiǎn)潔。如:FileInputStream f1,f2;String s;f1 = new FileInputStream(“file1.txt”);f2 = new FileInputStream(“file2.txt”);SequenceInputStream fs = new SequenceInputStream(f1, f2);DataInputStream ds = new DataInputStream(fs);while( (s = ds.readLine() != null ) System.out.println(s);3、字符流、字符流 前面說(shuō)過(guò),在JDK1.1
53、之前,java.io包中的流只有普通的字節(jié)流(以byte為基本處理單位的流),這種流對(duì)于以16位的Unicode碼表示的字符流處理很不方便。從JDK1.1開(kāi)始, java.io包中加入了專(zhuān)門(mén)用于字符流處理的類(lèi),它們是以Reader和Writer為基礎(chǔ)派生的一系列類(lèi)。 同類(lèi)InputStream和OutputStream一樣,Reader和Writer也是抽象類(lèi),只提供了一系列用于字符流處理的接口。它們的方法與類(lèi)InputStream和OutputStream類(lèi)似,只不過(guò)其中的參數(shù)換成字符或字符數(shù)組。 字節(jié)流中類(lèi)DataInputStream的readLine方法,可以以字節(jié)形式讀入,以Unic
54、ode形式輸出(String readLine())。byteUnicode16bit8 bit+00000000nvoid close()nvoid mark(int readAheadLimit)nboolean markSupported() :nint read() nint read(char cbuf) nint read(char cbuf, int off, int len) nboolean ready() nvoid reset() nlong skip(long n) 3、字符流、字符流基類(lèi):基類(lèi):Reader3、字符流、字符流基類(lèi):基類(lèi):Writernvoid clos
55、e() nvoid flush() nvoid write(char cbuf) nvoid write(char cbuf, int off, int len) nvoid write(int c) nvoid write(String str) nvoid write(String str, int off, int len) 3、字符流、字符流InputStreamReader和和OutputStreamWriter InputStreamReader和OutputStreamWriter是java.io包中用于處理字符流的最基本的類(lèi),用來(lái)在字節(jié)流和字符流之間作為中介:從字節(jié)輸入流讀入字
56、節(jié),并按編碼規(guī)范轉(zhuǎn)換為字符;往從字節(jié)輸入流讀入字節(jié),并按編碼規(guī)范轉(zhuǎn)換為字符;往字節(jié)輸出流寫(xiě)字符時(shí)先將字符按編碼規(guī)范轉(zhuǎn)換為字節(jié)字節(jié)輸出流寫(xiě)字符時(shí)先將字符按編碼規(guī)范轉(zhuǎn)換為字節(jié)。使用這兩者進(jìn)行字符處理時(shí),在構(gòu)造方法中應(yīng)指定一定的平臺(tái)規(guī)范,以便把以字節(jié)方式表示的流轉(zhuǎn)換為特定平臺(tái)上的字符表示。 InputStreamReader(InputStream in); /缺省規(guī)范 InputStreamReader(InputStream in, String enc); /指定規(guī)范enc OutputStreamWriter(OutputStream out); /缺省規(guī)范 OutputStreamWrit
57、er(OutputStream out, String enc); /指定規(guī)范enc3、字符流、字符流InputStreamReader和和OutputStreamWriter 如果讀取的字符流不是來(lái)自本地時(shí)(比如網(wǎng)上某處與本地編碼方式不同的機(jī)器),那么在構(gòu)造字符輸入流時(shí)就不能簡(jiǎn)單地使用缺省編碼規(guī)范,而應(yīng)該指定一種統(tǒng)一的編碼規(guī)范“ISO 8859_1”,這是一種映射到ASCII碼的編碼方式,能夠在不同平臺(tái)之間正確轉(zhuǎn)換字符。InputStreamReader ir = new InputStreamReader( is, “8859_1” );3、字符流、字符流緩存流:緩存流:BufferedR
58、eader和和BufferedWriter 同樣的,為了提高字符流處理的效率,java.io中也提供了緩沖流BufferedReader和BufferedWriter。其構(gòu)造方法與BufferedInputStream和BufferedOutputStream相類(lèi)似。另外,除了read()和write()方法外,它還提供了整行字符處理方法: public String readLine(): BufferedReader的方法,從輸入流中讀取一行字符,行結(jié)束標(biāo)志為n、r或兩者一起。 public void newLine(): BufferedWriter的方法,向輸出流中寫(xiě)入一個(gè)行結(jié)束標(biāo)志,
59、它不是簡(jiǎn)單的換行符n或r,而是系統(tǒng)定義的行隔離標(biāo)志(line separator)。class FileToUnicode public static void main(String args) try FileInputStream fis = new FileInputStream(“file1.txt); InputStreamReader dis = new InputStreamReader(fis); BufferedReader reader = new BufferedReader(dis); String s; while( (s = reader.readLine() !
60、= null ) System.out.println(read: +s); dis.close(); catch(IOException e) System.out.println(e); /main()/class3、字符流、字符流其它字符流其它字符流CharArrayReaderCharArrayWriter對(duì)字符數(shù)組進(jìn)行處理LineNumberReader:行處理字符流PrintWriter: 打印字符流FileReaderFileWriter對(duì)文本文件進(jìn)行處理StringReaderStringWriter對(duì)字符串進(jìn)行處理FilterReaderFilterWriter過(guò)濾字符流PipedReaderPipedWrit
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 高中音樂(lè)的教學(xué)計(jì)劃高中音樂(lè)鑒賞教學(xué)計(jì)劃
- 售后201年工作計(jì)劃
- 學(xué)生會(huì)工作總結(jié)與計(jì)劃怎么寫(xiě)
- 2025年初中化學(xué)教師下半年工作計(jì)劃范文
- 2025學(xué)校教研室工作計(jì)劃范文
- 2025年秋季二年級(jí)上冊(cè)班主任工作計(jì)劃報(bào)告
- 英語(yǔ)課標(biāo)教師教學(xué)計(jì)劃
- 2025年高一英語(yǔ)教學(xué)計(jì)劃例文
- 《地質(zhì)工程畢業(yè)設(shè)計(jì)》課件
- 《高血壓規(guī)范化管理》課件
- 收購(gòu)公司法律盡職調(diào)查合同(2篇)
- 第六單元多邊形的面積 (單元測(cè)試)-2024-2025學(xué)年五年級(jí)上冊(cè)數(shù)學(xué)人教版
- 《內(nèi)外科疾病康復(fù)學(xué)》課程教學(xué)大綱
- 天津市南開(kāi)區(qū)2023-2024學(xué)年四年級(jí)上學(xué)期期末英語(yǔ)試題
- 初中語(yǔ)文部編版七年級(jí)上冊(cè)期末復(fù)習(xí)詞語(yǔ)成語(yǔ)運(yùn)用練習(xí)題(附參考答案)
- 專(zhuān)題四“挺膺擔(dān)當(dāng)”主題團(tuán)課
- 概率論與數(shù)理統(tǒng)計(jì)課后習(xí)題與答案
- 建渣處置-運(yùn)輸方案(共4頁(yè))
- 空心板計(jì)算書(shū)
- 文件交接(模板)
- 家長(zhǎng)會(huì)邀請(qǐng)函模板
評(píng)論
0/150
提交評(píng)論