版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、以下內(nèi)容比較晦澀難懂I/O與流I/O是程序設(shè)計(jì)中的重要問題,大部分的應(yīng)用程序都需要I/O操作,比如從鍵盤獲得用戶輸入、在屏幕輸出運(yùn)行結(jié)果、對(duì)磁盤文件進(jìn)行讀寫等等。應(yīng)用程序只有通過I/O操作才能實(shí)現(xiàn)與用戶的交互及數(shù)據(jù)的處理及存儲(chǔ) 在Java語言中,將不同類型的I/O抽象為流。所謂“流(stream)”,可以看作是數(shù)據(jù)在文件或程序之間的傳遞 輸入流和輸出流 一般來說,流有兩種基本形式:輸入流和輸出流,根據(jù)程序是作為數(shù)據(jù)流的目的端還是源端來劃分。程序首先要打開一個(gè)流,才能與數(shù)據(jù)文件進(jìn)行通信。 通過輸入流,程序可以從數(shù)據(jù)文件讀取數(shù)據(jù),但不可向輸入流中寫入數(shù)據(jù);反之,通過輸出流,程序可以向數(shù)據(jù)文件中寫入
2、數(shù)據(jù)。程序與其他設(shè)備間的I/O也可以使用流,這時(shí)可將設(shè)備看作是一個(gè)數(shù)據(jù)文件。 Java I/O流類的組織模式 java.io在Java開發(fā)環(huán)境中,主要是由包java.io中提供的一系列的類和接口來實(shí)現(xiàn)輸入/輸出處理。而標(biāo)準(zhǔn)輸入/輸出處理則是由包java.lang中提供的類來處理的,這些類又都是從包java.io中的類繼承而來的。I/O類提供了低層次和高層次的界面。每一種介質(zhì)都有一對(duì)與之相關(guān)聯(lián)的輸入輸出類,它們提供低層次的面向數(shù)據(jù)序列(字符、字節(jié))的界面。與介質(zhì)相關(guān)的各個(gè)類都分別是輸入輸出抽象流類的子類,它們通常具有與介質(zhì)相關(guān)的構(gòu)造器及方法。I/O抽象類為所有與介質(zhì)相關(guān)的具體輸入輸出類提供了一個(gè)
3、統(tǒng)一的界面。反過來各個(gè)具體的與介質(zhì)相關(guān)的輸入輸出類也擴(kuò)展了抽象類,通過它們可以實(shí)現(xiàn)在具體介質(zhì)上的輸入輸出操作 I/O操作的一般步驟 構(gòu)造一個(gè)與介質(zhì)相關(guān)的I/O對(duì)象,以提供一種低層次的方法將數(shù)據(jù)輸入或輸出到相應(yīng)的介質(zhì);將與介質(zhì)相關(guān)的對(duì)象強(qiáng)制類型轉(zhuǎn)換為它的父類(即抽象I/O類),并利用該對(duì)象構(gòu)造一個(gè)流對(duì)象。這樣便建立起了流類對(duì)象與介質(zhì)相關(guān)對(duì)象的關(guān)聯(lián);這時(shí)就可利用流對(duì)象的I/O方法進(jìn)行相應(yīng)介質(zhì)上的數(shù)據(jù)讀寫。字節(jié)流類 /面向byte InputStream類InputStream類定義了一套所有字節(jié)輸入流所需的方法 方法描述read()將數(shù)據(jù)讀入流中skip()跳過流中的若干字節(jié)available()
4、返回當(dāng)前流中的可用字節(jié)mark()在流中標(biāo)記一個(gè)位置reset()返回到流中的標(biāo)記位置markSupported()返回一個(gè)boolean值,描述流是否支持標(biāo)記和復(fù)位close()關(guān)閉流OutputStream類OutputStream類定義了一套所有字節(jié)輸出流所需的方法。 方法描述write()寫數(shù)據(jù)到流flush()強(qiáng)制將被緩沖的內(nèi)容寫到輸出close()關(guān)閉流字符流類/面向charOutputStreamWriterReader與Writer類Reader類的相關(guān)方法:void close()void mark(int readAheadLimit)boolean markSupport
5、ed()int read() int read(char cbuf) int read(char cbuf, int off, int len) boolean ready() void reset() long skip(long n) Writer類的相關(guān)方法:void close() void flush() void write(char cbuf) void write(char cbuf, int off, int len) void write(int c) void write(String str) void write(String str, int off, int le
6、n) 流的使用(1)I/O類型流作用內(nèi)存CharArrayReaderCharArrayWriterByteArrayInputStreamByteArrayOutputStream用來從內(nèi)存讀取數(shù)據(jù)或向內(nèi)存寫入數(shù)據(jù)StringReaderStringWriterStringBufferInputStream從內(nèi)存里的某個(gè)String或StringBuffer讀字符或字節(jié)管道PipedReaderPipedWriterPipedInputStreamPipedOutputStream實(shí)現(xiàn)一個(gè)輸入、輸出管道。管道可用于一個(gè)線程的輸出連接到另一個(gè)線程的輸入流的使用(2)文件FileReaderFi
7、leWriterFileInputStreamFileOutputStream用于對(duì)本機(jī)文件系統(tǒng)上的一個(gè)件行讀寫聯(lián)結(jié)N/ASequenceInputStream將多個(gè)輸入流聯(lián)結(jié)成為一個(gè)輸入流對(duì)象串行化N/AObjectInputStreamObjectOutputStream將對(duì)象串行化數(shù)據(jù)轉(zhuǎn)換N/ADataInputStreamDataOutputStream以一種與機(jī)器無關(guān)的格式讀寫原始數(shù)據(jù)類型流的使用(3)計(jì)數(shù)LineNumberReaderLineNumberInputStream在讀取時(shí)記錄行數(shù)預(yù)覽PushbackReaderPushbackInputStream帶有“回推(push
8、back)”緩沖區(qū)的輸入流打印PrintWriterPrintStream包含便捷的打印方法的流。流的使用(4)緩沖BufferedReaderBufferedWriterBufferedInputStreamBufferedOutputStream緩沖流,用于在讀寫時(shí)進(jìn)行數(shù)據(jù)緩沖過濾FilterReaderFilterWriterFilterInputStreamFilterOutputStream過濾流的抽象類接口。數(shù)據(jù)讀寫時(shí)對(duì)數(shù)據(jù)進(jìn)行過濾在字節(jié)和字符之間轉(zhuǎn)換InputStreamReaderOutputStreamWriter字節(jié)流和字符類間的轉(zhuǎn)換橋梁文件流要對(duì)本機(jī)文件系統(tǒng)上的文件進(jìn)行讀
9、寫,需要使用文件流。Java的文件流類包括字符流的FileReader、FileWriter和字節(jié)流的FileInputStream、FileOutputStream。文件流對(duì)象的構(gòu)造需要提供文件名作為參數(shù),也即可以通過文件名來創(chuàng)建文件流。這里的所謂文件名可以是字符串、File對(duì)象或FileDescriptor對(duì)象。內(nèi)存流為了支持內(nèi)存上的輸入輸出,java.io包內(nèi)提供了一組相關(guān)的類:字節(jié)流類ByteArrayInputStream ByteArrayOutputStream StringBufferInputStream字符流類CharArrayReader CharArrayWriter
10、StringReader StringWriter例程importjava.io.*;publicclassByteArrayOutputStreamTest publicstaticvoidmain(Stringargs) try ByteArrayOutputStreambaos=newByteArrayOutputStream(); PrintStreamps=newPrintStream(baos); for(inti=0;i1000;i+) ps.println(i+ABCDEFGHIJKLMNOPQRSTUVWXYZ); longstart=System.currentTimeMi
11、llis(); FileOutputStreamfos= newFileOutputStream(ByteArrayOutputStreamTest); baos.writeTo(fos); fos.close(); longstop=System.currentTimeMillis(); System.out.println(timeelapsed(milliseconds)=+(stop-start); catch(FileNotFoundExceptionfnfe) System.out.println(fnfe.getMessage(); catch(IOExceptionioe) S
12、ystem.out.println(ioe.getMessage(); 管道流 管道是用來把一個(gè)線程的輸出連接到另一個(gè)線程的輸入。管道輸入流作為一個(gè)通信管道的接收端,管道輸出流則作為發(fā)送端。管道流必須是輸入輸出并用,也就是說在使用管道前,兩者必須進(jìn)行連接。為什么要用到管道流?當(dāng)某個(gè)程序的輸出作為另外一個(gè)程序的輸入時(shí),如果沒有管道,就必須為程序提供一個(gè)存放中間結(jié)果的位置,前一個(gè)程序?qū)⑤敵鰯?shù)據(jù)寫入該位置,而后一個(gè)程序再從該位置讀出這些數(shù)據(jù),這樣的做法無疑是低效率的。通過管道,可以連接程序的輸出和輸入,直接將前一程序的輸出作為后一程序的輸入,提高了程序效率。 管道流的連接方式j(luò)ava.io中為字符類
13、型和字節(jié)類型各提供了一對(duì)輸入輸出管道流類:PipedReader/ PipedWriter和PipedInputStream/PipedOutputStream。管道流的連接方式有兩種,以PipedInputStream/PipedOutputStream為例:在構(gòu)造方法中進(jìn)行連接:PipedInputStream(PipedOutputStream pos); PipedOutputStream(PipedInputStream pis);通過各自的connect()方法連接: 在類PipedInputStream中,connect(PipedOutputStream pos); 在類Pip
14、edOutputStream中,connect(PipedInputStream pis);例程class PipedExample public static void main(String args) throws IOException byte dataA = 123, dataB= 321; PipedInputStream pis = new PipedInputStream(); PipedOutputStream pos = new PipedOutputStream(pis); System.out.println(PipedInputStream); try pos.wr
15、ite(dataA); pos.write(dataB); System.out.println(byte)pis.read(); System.out.println(byte)pis.read(); finally pis.close(); pos.close(); 過濾器流在某些情況下,對(duì)于由程序?qū)懭牖蜃x取的數(shù)據(jù),需要在寫入或讀取之前對(duì)其進(jìn)行處理或者過濾 總的來說,過濾器的作用是對(duì)相關(guān)輸入輸出流中的數(shù)據(jù)進(jìn)行處理,而對(duì)于程序而言,這些過濾器是透明的。過濾器流類 類型類作用字節(jié)FilterInputStreamFilterOutputStream字節(jié)類型的過濾器類的抽象父類BufferedI
16、nputStreamBufferedOutputStream緩沖過濾器流,用于提高輸入輸出效率PushBackInputStream允許將已讀取的數(shù)據(jù)“壓回”到流中GZIPInputStreamGZIPOutputStreamZipInputStreamZipOutputStream對(duì)數(shù)據(jù)進(jìn)行zip格式或gzip格式的壓縮字符FilterReaderFilterWriter字符類型過濾器類的抽象父類BufferedReaderBufferedWriter緩沖過濾器流,用于提高輸入輸出效率PushBackReader允許將已讀取的數(shù)據(jù)“壓回”到流中LineNumberReader用計(jì)數(shù)器統(tǒng)計(jì)從輸
17、入中讀取的數(shù)據(jù)行數(shù)例程import java.io.*; public class ReadLineTest public static void main(String args) try BufferedReader br = new BufferedReader(new FileReader(args0); String line = null; int i = 0; while(line = br.readLine() != null) i+; System.out.println(i + : + line); br.close(); catch(Exception e) e.prin
18、tStackTrace(); 對(duì)象的串行化所謂對(duì)象串行化是指讀寫對(duì)象的過程,其關(guān)鍵之處在于以串行的流的形式來表示結(jié)構(gòu)化的對(duì)象。為了實(shí)現(xiàn)完整對(duì)象的輸入輸出,java.io包中提供了兩個(gè)類:ObjectOutputStream和ObjectInputStream。這兩個(gè)流類與其他的字節(jié)流類的功能類似,其特殊之處在于通過它們可以讀寫對(duì)象。對(duì)象的串行化通常在下面兩個(gè)方式下使用:遠(yuǎn)程方法調(diào)用(RMI)在遠(yuǎn)程方法調(diào)用時(shí),需要在客戶機(jī)與服務(wù)器之間傳遞各種對(duì)象。對(duì)象持久性保存允許對(duì)象在創(chuàng)建它們的程序的生命周期結(jié)束后仍然存在保存,供以后的程序調(diào)用。Serializable接口 并非所有對(duì)象都是可串行化的,如果要
19、對(duì)某對(duì)象進(jìn)行串行化,該對(duì)象的類必須實(shí)現(xiàn)Serializable接口 Serializable接口是一個(gè)空接口,也就是說,它不包含任何方法的聲明,該接口的作用只是表明這個(gè)類的對(duì)象可以被串行化 隨機(jī)文件處理使用流的形式對(duì)文件進(jìn)行讀寫必須順序進(jìn)行,也就是說這些文件流的數(shù)據(jù)必須按先后次序進(jìn)行處理。在對(duì)某些順序存儲(chǔ)訪問介質(zhì),例如磁帶等進(jìn)行訪問時(shí),這樣的文件流方式非常有用 隨機(jī)文件存取提供了一種更靈活的文件讀寫方式,它允許對(duì)文件的內(nèi)容進(jìn)行非順序的訪問。在這里,“隨機(jī)”是指所存取的數(shù)據(jù)不需要與以前存取過的歷史數(shù)據(jù)有任何的關(guān)系。使用隨即文件存取方式可以在打開一個(gè)文件后同時(shí)進(jìn)行讀寫操作,并且可以移動(dòng)文件指針使其
20、指向文件中的任何位置 隨機(jī)存取文件的結(jié)構(gòu)在文件內(nèi)部,文件被分成固定長(zhǎng)度的數(shù)據(jù)塊(記錄)。從概念上來說,文件可以看作是一個(gè)記錄數(shù)組。文件指針的移動(dòng)是以記錄為單位的。文件類 FileFile類的核心概念是封裝用戶文件系統(tǒng)中的某個(gè)文件或目錄,它包含許多用于執(zhí)行文件常規(guī)操作的方法以及檢查、訪問、刪除、創(chuàng)建、更改指定的文件或目錄File類的構(gòu)造函數(shù)有三個(gè),分別根據(jù)文件名、文件路徑與文件名、文件對(duì)象(目錄)與文件名創(chuàng)建實(shí)例:public File(String path)public File(String path,String name)public File(File dir,String name
21、) RandomAccessFile類RandomAccessFile類的構(gòu)造函數(shù)使用了兩個(gè)參數(shù),第一個(gè)參數(shù)表示要操作的文件,可以使用字符串類型的文件名也可以使用一個(gè)文件對(duì)象;第二個(gè)字符串類型的參數(shù)mode表示了對(duì)文件的操作方式:mode為 ”r” 時(shí)表示可以從文件讀?。籱ode 為 ”rw” 時(shí)表示既可以從文件讀取也可以向文件寫入 RandomAccessFile類通過實(shí)現(xiàn)DataInput和DataOutPut的方法來實(shí)現(xiàn)文件數(shù)據(jù)的讀寫,這些方法允許使用二進(jìn)制編碼形式將基本的Java類型寫入或讀出文件。在RandomAccessFile類中還提供了一些操作文件指針的方法,如通過seek方法可以將文件指針移動(dòng)到其參數(shù)所制定的位置。例程importjava.io.*;publicclassFileTest publicstaticvoidmain(Stringargs)throwsIOException RandomAccessFileraf=newRandomAccessFile(foo.txt,rw); try Writerout= newOutputStreamWriter(newFileOutputStream(raf.getFD(),UTF-
溫馨提示
- 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. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年版廣告投放合同詳細(xì)條款
- 學(xué)期家委會(huì)工作計(jì)劃六篇
- 中國紅酒包裝設(shè)計(jì)行業(yè)發(fā)展監(jiān)測(cè)及發(fā)展戰(zhàn)略規(guī)劃報(bào)告
- 中國單雙面膠粘帶項(xiàng)目投資可行性研究報(bào)告
- 中國鹽酸貝那普利行業(yè)市場(chǎng)供需格局及投資規(guī)劃建議報(bào)告
- 消費(fèi)者效用最大化探究問卷調(diào)查報(bào)告
- 大學(xué)生電工實(shí)習(xí)報(bào)告錦集十篇
- 網(wǎng)頁課程設(shè)計(jì)備忘錄
- 2022年醫(yī)院后勤個(gè)人工作計(jì)劃
- 筷子課程設(shè)計(jì)教案
- 2024年機(jī)動(dòng)車檢測(cè)站質(zhì)量手冊(cè)程序文件記錄表格合集(根據(jù)補(bǔ)充要求編制)
- 公司未來發(fā)展規(guī)劃及目標(biāo)制定
- 2024年01月11067知識(shí)產(chǎn)權(quán)法期末試題答案
- 2025版國家開放大學(xué)法律事務(wù)??啤睹穹▽W(xué)(2)》期末紙質(zhì)考試案例分析題庫
- 一年級(jí)家長(zhǎng)會(huì)課件2024-2025學(xué)年
- 情侶防出軌合同模板
- 2024公安機(jī)關(guān)人民警察高級(jí)執(zhí)法資格考試題及答案
- 2023-2024學(xué)年云南省昆明市五華區(qū)八年級(jí)(上)期末物理試卷
- 陜西省渭南市2023-2024學(xué)年七年級(jí)上學(xué)期期末考試數(shù)學(xué)試題(含答案)2
- 廢棄催化劑中貴金屬的回收
- 期末 (試題) -2024-2025學(xué)年譯林版(三起)(2024)英語三年級(jí)上冊(cè)
評(píng)論
0/150
提交評(píng)論