




已閱讀5頁(yè),還剩24頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Return,第10章輸入與輸出,10.1 Java輸入/輸出基礎(chǔ) 10.2 讀取控制臺(tái)輸入 10.3 向控制臺(tái)寫(xiě)輸出 10.4 流類 10.5 文件的讀寫(xiě),在Java語(yǔ)言中,輸入與輸出完全基于“流”這個(gè)概念。Java輸入輸出的流式接口為復(fù)雜而繁重的I/O編程任務(wù)提供了一個(gè)簡(jiǎn)潔的抽象。本章將對(duì)這方面的內(nèi)容作詳細(xì)介紹。,Return,10.1 Java輸入/輸出基礎(chǔ),10.1.1 流的概念 10.1.2 字節(jié)流和字符流 10.1.3 預(yù)定義流 10.1.4 Java輸入/輸出類和接口,關(guān)于Java的輸入/輸出問(wèn)題我們?cè)谇懊娴某绦虼a中一般都接觸過(guò),只是沒(méi)有系統(tǒng)地進(jìn)行討論。本節(jié)將對(duì)Java的輸入/輸出問(wèn)題作一個(gè)概述。,10.1.1流的概念,我們知道,多數(shù)程序在不獲取外部數(shù)據(jù)的情況下不能順利完成目標(biāo)。數(shù)據(jù)從一個(gè)輸入源獲得,程序的結(jié)果被送到輸出目的地。在Java中,這些源和目的地被廣泛地定義。例如一個(gè)網(wǎng)絡(luò)連接器,內(nèi)存緩沖區(qū)或磁盤文件可以被Java輸入/輸出類熟練地操作。盡管從物理意義上很難說(shuō)明,這些外設(shè)都由相同的抽象體流(stream)來(lái)處理。流是一個(gè)生產(chǎn)或消費(fèi)信息的邏輯實(shí)體,它通過(guò)Java輸入/輸出系統(tǒng)與物理設(shè)備相連。盡管與之相連的實(shí)際物理設(shè)備各不相同,但是所有的流都以同樣的方式運(yùn)轉(zhuǎn)。 Java程序通過(guò)流來(lái)完成輸入/輸出,它是生產(chǎn)或消費(fèi)信息的抽象。流通過(guò)Java的輸入/輸出系統(tǒng)與物理設(shè)備鏈接。盡管與它們鏈接的物理設(shè)備不盡相同,但是所有流的行為具有同樣的方式。這樣,相同的輸入/輸出類和方法適用于所有類型的外部設(shè)備。這意味著一個(gè)輸入流能夠抽象多種不同類型的輸入:從磁盤文件,從鍵盤或從網(wǎng)絡(luò)套接字。同樣,一個(gè)輸出流可以輸出到控制臺(tái),磁盤文件或相連的網(wǎng)絡(luò)。流是處理輸入/輸出的一個(gè)潔凈的方法,例如它不需要代碼理解鍵盤和網(wǎng)絡(luò)的不同。Java中流的實(shí)現(xiàn)是基于java.io包定義的類層次結(jié)構(gòu)的。,Return,10.1.2字節(jié)流和字符流,在Java 2中,定義了兩種類型的流:字節(jié)類和字符類。字節(jié)流(byte stream)為處理字節(jié)的輸入和輸出提供了方便的方法。例如,使用字節(jié)流讀取或書(shū)寫(xiě)二進(jìn)制數(shù)據(jù)。字符流(character stream)為字符的輸入和輸出處理提供了方便。這兩種流采用了統(tǒng)一的編碼標(biāo)準(zhǔn),因而可以國(guó)際化。當(dāng)然,在某些場(chǎng)合字符流比字節(jié)流更為有效。 在Java的早期版本(Java 1.0)中不包括字符流,因此所有的輸入和輸出都是以字節(jié)為單位的。后來(lái),Java 1.1中加入了字符流,某些字節(jié)形式的類和方法不被推薦使用。這也是為什么沒(méi)用字符流的老代碼在適當(dāng)?shù)牡胤叫枰碌脑颉?需要說(shuō)明的是,在最底層,所有的輸入/輸出都是字節(jié)形式的?;谧址牧髦皇菫樘幚碜址峁┓奖阌行У姆椒ā?下面對(duì)字節(jié)流和字符流分別作簡(jiǎn)要介紹。,字節(jié)流由兩個(gè)類層次結(jié)構(gòu)定義。在頂層有兩個(gè)抽象類:InputStream 和 OutputStream。每個(gè)抽象類都有多個(gè)具體的子類,這些子類對(duì)不同的外設(shè)進(jìn)行處理,例如磁盤文件、網(wǎng)絡(luò)連接、甚至是內(nèi)存緩沖區(qū)。各種字節(jié)流類及其相關(guān)說(shuō)明見(jiàn)教材P235頁(yè)。,1字節(jié)流類,字符流類由兩個(gè)類層次結(jié)構(gòu)定義。頂層有兩個(gè)抽象類:Reader和Writer。這些抽象類處理統(tǒng)一編碼的字符流。在Java中這些類含有多個(gè)具體的子類詳見(jiàn)教材P235236頁(yè)。,2字符流類,Return,10.1.3預(yù)定義流,我們已經(jīng)知道,所有的Java程序運(yùn)行時(shí)自動(dòng)導(dǎo)入java.lang包,這個(gè)包定義了一個(gè)名為System的類,該類封裝了運(yùn)行時(shí)環(huán)境的多個(gè)方面。例如,使用它的某些方法,能獲得當(dāng)前時(shí)間和與系統(tǒng)有關(guān)的不同屬性。System同時(shí)還包含有3個(gè)預(yù)定義的流變量:in、out和err。這些成員在System中是被定義成public和static型的,即意味著它們可以不引用特定的System對(duì)象而被用于程序的其他部分。 System.out是標(biāo)準(zhǔn)的輸出流,在默認(rèn)情況下它是一個(gè)控制臺(tái);System.in是標(biāo)準(zhǔn)輸入,默認(rèn)情況下指的是鍵盤;System.err指的是標(biāo)準(zhǔn)錯(cuò)誤流,它默認(rèn)是控制臺(tái)。需要指出的是,這些流可以重定向到任何兼容的輸入/輸出設(shè)備。 System.in是InputStream的對(duì)象;System.out和System.err是PrintStream的對(duì)象。盡管它們是用來(lái)讀寫(xiě)外設(shè)字符的,它們都是字節(jié)流。如果編程人員愿意,可以用基于字符的流來(lái)包裝它們。在前面章節(jié)中多次用到過(guò)System.out,我們可以同樣的方式使用System.err。System.in的使用則稍微復(fù)雜一些。,Return,10.1.4 Java輸入/輸出類和接口,在Java 2中,java.io包定義的輸入/輸出類見(jiàn)教材P236237頁(yè)。不難發(fā)現(xiàn),其中包含了前面所介紹的字節(jié)流和字符流。其中,ObjectInputStream.GetField和ObjectOutputStream.PutField是Java 2中新添的內(nèi)部類。對(duì)于Java 2不推薦使用的兩個(gè)類LineNumber InputStream和StringBufferInputStream,上面沒(méi)有列出。雖然java.io中予以保留,但一般情況下不應(yīng)使用。 由java.io定義的接口見(jiàn)教材237頁(yè)。其中,F(xiàn)ileFilter接口是Java 2中新增的。 從以上介紹不難發(fā)現(xiàn),java.io包中有很多的類和接口,包括各種字節(jié)流、字符流、對(duì)象序列化(對(duì)象的存儲(chǔ)和釋放)。后面我們將介紹其中一些最常用的I/O成員。,Return,Return,10.2 讀取控制臺(tái)輸入,10.2.1如何讀取控制臺(tái)輸入 10.2.2讀取字符 10.2.3讀取字符串,在本節(jié)中,我們將介紹Java如何讀取控制臺(tái)輸入的有關(guān)問(wèn)題。,10.2.1如何讀取控制臺(tái)輸入,在Java 1.0中,完成控制臺(tái)輸入的唯一途徑是字節(jié)流,這種方法現(xiàn)在依舊可用。但是,這種做法不值得推薦。在Java 2中,讀取控制臺(tái)輸入的首選方法應(yīng)該是字符流,它使程序容易符合國(guó)際標(biāo)準(zhǔn),并且易于維護(hù)。 在Java中,控制臺(tái)輸入由從System.in讀取數(shù)據(jù)來(lái)完成。為獲得屬于控制臺(tái)的字符流,在BufferedReader對(duì)象中包裝了System.in。BufferedReader支持緩沖輸入流,它最常見(jiàn)的構(gòu)造函數(shù)如下: BufferedReader(Reader inputReader) 其中,inputReader是鏈接被創(chuàng)建的BufferedReader實(shí)例的流。Reader是一個(gè)抽象類,它的一個(gè)具體的子類是InputStreamReader,該子類將字節(jié)轉(zhuǎn)換成字符。為獲得鏈接System.in的一個(gè)InputStreamReader的對(duì)象,使用下面的構(gòu)造函數(shù): InputStreamReader(InputStream inputStream) 由于System.in引用了InputStream 類型的對(duì)象,它可以用于inputStream。綜上所述,下面的代碼創(chuàng)建了與鍵盤相連的BufferedReader對(duì)象。 BufferedReader br = new BufferedReader(new InputStreamReader(System.in); 當(dāng)該語(yǔ)句執(zhí)行后,br是通過(guò)System.in生成的鏈接控制臺(tái)的字符流。,Return,10.2.2讀取字符,要從BufferedReader讀取字符,用read()。例如: int read( ) throws IOException 該方法每次執(zhí)行都從輸入流讀取一個(gè)字符,然后以整型形式返回。當(dāng)遇到流的末尾時(shí),它返回-1。可以看到,它要引發(fā)一個(gè)IOException異常。 分析教材P238頁(yè)的例子。,Return,10.2.3讀取字符串,從鍵盤讀取字符串,使用readLine()方法,它是BufferedReader 類的成員。這個(gè)方法的一般使用形式如下。 String readLine() throws IOException 該方法返回一個(gè)String對(duì)象。 例如,教材P239頁(yè)的程序可生成一個(gè)小文本編輯器。它創(chuàng)建了一個(gè)String對(duì)象的數(shù)組,然后依行讀取文本,將文本的每一行存入到數(shù)組中。當(dāng)它讀到100行或輸入“stop”時(shí)才停止。該例程使用一個(gè)BufferedReader類來(lái)從控制臺(tái)讀取數(shù)據(jù)。,Return,Return,10.3 向控制臺(tái)寫(xiě)輸出,10.3.1 如何向控制臺(tái)寫(xiě)輸出 10.3.2 PrintWriter類,在前面章節(jié)中我們接觸過(guò)的控制臺(tái)輸出方式有print()和println()等簡(jiǎn)單途徑,這兩種方法由PrintStream(System.out引用的對(duì)象類型)定義。本節(jié)介紹如何進(jìn)行控制臺(tái)寫(xiě)輸出。,10.3.1如何向控制臺(tái)寫(xiě)輸出,因?yàn)镻rintStream是從OutputStream派生的輸出流,它同樣實(shí)現(xiàn)低級(jí)方法write()。write()可用來(lái)向控制臺(tái)寫(xiě)數(shù)據(jù),PrintStream定義的write()的最簡(jiǎn)單形式是:void write(int byteval) 該方法按照byteval指定的數(shù)向文件寫(xiě)字節(jié)。盡管byteval定義成整數(shù),但只有低位的8個(gè)字節(jié)被寫(xiě)入。下面的例程用write()向屏幕輸出字符“A”,然后是新的行: / Demonstrate System.out.write(). class WriteDemo public static void main(String args) int b; b = A; System.out.write(b); System.out.write(n); 一般情況下,我們不用write()來(lái)完成向控制臺(tái)的輸出,盡管在某些場(chǎng)合很有效。相比來(lái)說(shuō)print()和println()方法更容易使用。,Return,10.3.2 PrintWriter 類,盡管Java允許使用System.out向控制臺(tái)寫(xiě)數(shù)據(jù),但建議僅用于調(diào)試程序時(shí)。對(duì)于實(shí)際的程序,Java推薦的向控制臺(tái)寫(xiě)數(shù)據(jù)的方法是用PrintWriter流。PrintWriter是基于字符的類,用基于字符的類向控制臺(tái)寫(xiě)數(shù)據(jù)使程序更為國(guó)際化。 PrintWriter定義了多個(gè)構(gòu)造函數(shù),我們所用到的一個(gè)如下。 PrintWriter(OutputStream outputStream, boolean flushOnNewline) 這里,outputStream是OutputStream類的對(duì)象,flushOnNewline控制Java是否在println( )方法被調(diào)用時(shí)刷新輸出流。如果flushOnNewline為true,刷新自動(dòng)發(fā)生,若為false,則不發(fā)生。 PrintWriter支持所有類型(包括Object)的print()和println()方法,這樣,我們就可以像用System.out那樣用這些方法。如果遇到不同類型的情況,PrintWriter方法調(diào)用對(duì)象的toString()方法并打印結(jié)果。 用PrintWriter向外設(shè)寫(xiě)數(shù)據(jù),指定輸出流為System.out,并在每一新行后刷新流。教材P241頁(yè)的代碼創(chuàng)建了與控制臺(tái)輸出相連的PrintWriter類。,Return,Return,10.4 流類,10.4.1字節(jié)流 10.4.2字符流,前面我們簡(jiǎn)單介紹了控制臺(tái)的輸入/輸出,下面我們具體介紹各種流類。Java 的流式輸入/輸出建立在4個(gè)抽象類的基礎(chǔ)上:InputStream、OutputStream、Reader和Writer。這些類在前面已經(jīng)提到過(guò),它們用來(lái)創(chuàng)建具體流式子類。盡管程序通過(guò)具體子類執(zhí)行輸入/輸出操作,頂層的類定義了所有流類的基礎(chǔ)通用功能。 我們已經(jīng)知道,InputStream和OutputStream設(shè)計(jì)成字節(jié)流類,而Reader和Writer為字符流設(shè)計(jì)。字節(jié)流類和字符流類形成分離的層次結(jié)構(gòu)。一般說(shuō)來(lái),處理字符或字符串時(shí)應(yīng)使用字符流類,處理字節(jié)或二進(jìn)制對(duì)象時(shí)應(yīng)使用字節(jié)流類。下面分別介紹字節(jié)流和字符流類。,10.4.1字節(jié)流,字節(jié)流類為處理字節(jié)式輸入/輸出提供了豐富的環(huán)境,一個(gè)字節(jié)流可以和其他任何類型的對(duì)象并用,包括二進(jìn)制數(shù)據(jù)。這樣的多功能性使得字節(jié)流對(duì)很多類型的程序都很重要。由于字節(jié)流類以InputStream 和OutputStream為頂層,我們就從討論這兩個(gè)類開(kāi)始。,InputStream是一個(gè)定義了Java流式字節(jié)輸入模式的抽象類,該類的所有方法在出錯(cuò)條件下引發(fā)一個(gè)IOException 異常。InputStream的各種方法見(jiàn)教材P242頁(yè)。,1InputStream(輸入流),OutputStream是定義了流式字節(jié)輸出模式的抽象類,該類的所有方法返回一個(gè)void 值并且在出錯(cuò)情況下引發(fā)一個(gè)IOException異常。OutputStream的各種方法見(jiàn)教材P242頁(yè)。,2OutputStream(輸出流),FileInputStream 類創(chuàng)建一個(gè)能從文件讀取字節(jié)的InputStream 類,它的兩個(gè)常用的構(gòu)造函數(shù)如下: FileInputStream(String filepath) FileInputStream(File fileObj) 它們都能引發(fā)FileNotFoundException異常。這里,filepath 是文件的全稱路徑,fileObj是描述該文件的File對(duì)象。 分析教材P243頁(yè)的例子。,3FileInputStream(文件輸入流),FileOutputStream 創(chuàng)建了一個(gè)可以向文件寫(xiě)入字節(jié)的類OutputStream,它常用的構(gòu)造函數(shù)如下: FileOutputStream(String filePath) FileOutputStream(File fileObj) FileOutputStream(String filePath, boolean append) 它們可以引發(fā)IOException或SecurityException異常。這里,filePath是文件的全稱路徑,fileObj是描述該文件的File對(duì)象。如果append為true,文件以設(shè)置搜索路徑模式打開(kāi)。 FileOutputStream的創(chuàng)建不依賴于文件是否存在。在創(chuàng)建對(duì)象時(shí)FileOutputStream在打開(kāi)輸出文件之前創(chuàng)建它。這種情況下,如果試圖打開(kāi)一個(gè)只讀文件,將會(huì)引發(fā)一個(gè) IOException異常。教材P244245頁(yè)的例子用于創(chuàng)建一個(gè)樣本字節(jié)緩沖器。,4FileOutputStream(文件輸出流),RandomAccessFile包裝了一個(gè)隨機(jī)訪問(wèn)的文件,注意它不是派生于InputStream和OutputStream,而是實(shí)現(xiàn)了基本輸入/輸出方法的DataInput和DataOutput接口。它同樣支持定位請(qǐng)求,也就是說(shuō)可以在文件內(nèi)部放置文件指針。它有兩個(gè)構(gòu)造函數(shù): RandomAccessFile(File fileObj, String access) throws FileNotFoundException RandomAccessFile(String filename, String access)throws FileNotFound Exception 第一種形式,fileObj指定了作為File 對(duì)象打開(kāi)的文件的名稱;第二種形式,文件名是由filename參數(shù)傳入的。兩種情況下,access 都決定允許訪問(wèn)何種文件類型。如果是“r”,那么文件可讀不可寫(xiě),如果是“rw”,文件以讀寫(xiě)模式打開(kāi)。,5RandomAccessFile(隨機(jī)訪問(wèn)文件類),ByteArrayInputStream是把字節(jié)數(shù)組當(dāng)成源的輸入流。該類有兩個(gè)構(gòu)造函數(shù),每個(gè)構(gòu)造函數(shù)需要一個(gè)字節(jié)數(shù)組提供數(shù)據(jù)源。 ByteArrayInputStream(byte array ) ByteArrayInputStream(byte array , int start, int numBytes) 這里,array是輸入源。第二個(gè)構(gòu)造函數(shù)創(chuàng)建了一個(gè)InputStream類,該類從字節(jié)數(shù)組的子集生成,以start指定索引的字符為起點(diǎn),長(zhǎng)度由numBytes決定。教材P246頁(yè)的例子創(chuàng)建了兩個(gè)ByteArrayInputStream對(duì)象,并用字母表的字節(jié)初始化它們。,6ByteArrayInputStream(字節(jié)數(shù)組輸入流),ByteArrayOutputStream是一個(gè)把字節(jié)數(shù)組當(dāng)作輸出流的實(shí)現(xiàn)。ByteArrayOutputStream 有兩個(gè)構(gòu)造函數(shù),分別如下: ByteArrayOutputStream( ) ByteArrayOutputStream(int numBytes) 在第一種形式里,一個(gè)32位字節(jié)的緩沖器被生成。第二個(gè)構(gòu)造函數(shù)生成一個(gè)跟指定numBytes相同位數(shù)的緩沖器。緩沖器保存在ByteArrayOutputStream的受保護(hù)的buf 成員里。緩沖器的大小在需要的情況下會(huì)自動(dòng)增加。緩沖器保存的字節(jié)數(shù)是由ByteArrayOutput Stream的受保護(hù)的count域保存的。教材P247頁(yè)的例程演示了ByteArrayOutputStream的使用。,7ByteArrayOutputStream(字節(jié)數(shù)組輸出流),過(guò)濾流(filtered stream)僅僅是底層透明地提供擴(kuò)展功能的輸入流(輸出流)的包裝。這些流一般由普通類的方法訪問(wèn)。典型的擴(kuò)展是緩沖,字符轉(zhuǎn)換和原始數(shù)據(jù)轉(zhuǎn)換。這些過(guò)濾字節(jié)流是FilterInputStream 和FilterOutputStream。它們的構(gòu)造函數(shù)分別如下。 FilterOutputStream(OutputStream os) FilterInputStream(InputStream is) 這些類提供的方法和InputStream 及OutputStream類的方法相同。,8過(guò)濾字節(jié)流,對(duì)于字節(jié)流,緩沖流(buffered stream)是一種字節(jié)流,通過(guò)把內(nèi)存緩沖器連到輸入/輸出流而擴(kuò)展一個(gè)過(guò)濾流類。該緩沖器允許Java對(duì)多個(gè)字節(jié)同時(shí)進(jìn)行輸入/輸出操作,提高了程序性能。因?yàn)榫彌_器可用,所以可以跳過(guò)、標(biāo)記和重新設(shè)置流。緩沖字節(jié)流類是BufferedInputStream 和BufferedOutputStream。PushbackInputStream 也可實(shí)現(xiàn)緩沖流。詳細(xì)情況見(jiàn)教材P248251頁(yè)的介紹。,9緩沖字節(jié)流,10SequenceInputStream(順序輸入流),SequenceInputStream類允許連接多個(gè)InputStream流,這個(gè)類的構(gòu)造不同于任何其他的InputStream。SequenceInputStream構(gòu)造函數(shù)要么使用一對(duì)InputStream,要么用InputStream的一個(gè)Enumeration,一般形式如下: SequenceInputStream(InputStream first, InputStream second) SequenceInputStream(Enumeration streamEnum) 從操作上來(lái)講,該類滿足讀取完第一個(gè)InputStream后轉(zhuǎn)去讀取第二個(gè)流的讀取要求。使用Enumeration的情況下,它將繼續(xù)讀取所有InputStream流直到最后一個(gè)被讀完。分析教材P251252頁(yè)的示例。,PrintStream具有我們?cè)赟ystem文件句柄使用過(guò)的System.out所有的格式化性能。PrintStream有兩個(gè)構(gòu)造函數(shù): PrintStream(OutputStream outputStream) PrintStream(OutputStream outputStream, boolean flushOnNewline) 當(dāng)flushOnNewline控制Java每次刷新輸出流時(shí),輸出一個(gè)換行符(n)。如果flushOnNewline為true,自動(dòng)刷新;若為false,刷新不能自動(dòng)進(jìn)行。第一個(gè)構(gòu)造函數(shù)不支持自動(dòng)刷新。Java的PrintStream對(duì)象支持包括Object在內(nèi)的各種類型的print()和println()方法。如果參數(shù)不是一個(gè)簡(jiǎn)單類型,PrintStream方法將調(diào)用對(duì)象的toString()方法,然后打印結(jié)果。,11PrintStream(打印流),Return,盡管字節(jié)流提供了處理任何類型輸入/輸出操作的足夠的功能,它們不能直接操作Unicode字符。既然Java的主要目標(biāo)是支持“只寫(xiě)一次,到處運(yùn)行”的信念,包括直接的字符輸入輸出支持是必要的。本節(jié)將討論幾個(gè)字符輸入輸出類。如前所述,字符流層次結(jié)構(gòu)的頂層是Reader和Writer抽象類,下面從這兩個(gè)類開(kāi)始介紹。,10.4.2 字符流,Reader是定義Java的流式字符輸入模式的抽象類,該類的所有方法在出錯(cuò)情況下都將引發(fā)IOException 異常。教材P253頁(yè)給出了Reader類中的各種方法。,1Reader類,Writer是定義流式字符輸出的抽象類,所有該類的方法都返回一個(gè)void 值并在出錯(cuò)條件下引發(fā)IOException 異常。教材P253頁(yè)給出了Writer類中的各種方法。,2Writer類,FileReader類創(chuàng)建了一個(gè)可以讀取文件內(nèi)容的Reader類,它最為常用的構(gòu)造函數(shù)形式如下: FileReader(String filePath) FileReader(File fileObj) 每一個(gè)都能引發(fā)一個(gè)FileNotFoundException異常。在這里,filePath是一個(gè)文件的完整路徑,fileObj是描述該文件的File 對(duì)象。教材P254頁(yè)的例子演示了怎樣從一個(gè)文件逐行讀取并把它輸出到標(biāo)準(zhǔn)輸入流。,3FileReader類,FileWriter創(chuàng)建一個(gè)可以寫(xiě)文件的Writer 類,它最常用的構(gòu)造函數(shù)形式如下 FileWriter(String filePath) FileWriter(String filePath, boolean append) FileWriter(File fileObj) 它們可以引發(fā)IOException或者SecurityException異常。在這里,filePath是文件的完全路徑,fileObj是描述該文件的File對(duì)象。如果append為true,輸出是附加到文件尾的。 FileWriter類的創(chuàng)建不依賴于文件存在與否。在創(chuàng)建文件之前,F(xiàn)ileWriter將在創(chuàng)建對(duì)象時(shí)打開(kāi)它來(lái)作為輸出。如果試圖打開(kāi)一個(gè)只讀文件,將引發(fā)一個(gè)IOException異常。教材P254255頁(yè)的例子是對(duì)前面討論FileOutputStream時(shí)用到例子的字符流形式的版本。它創(chuàng)建了一個(gè)樣本字符緩沖器,開(kāi)始生成一個(gè)String,然后用getChars( )方法提取字符數(shù)組。,4FileWriter類,CharArrayReader是一個(gè)將字符數(shù)組作為源的輸入流的實(shí)現(xiàn)。該類有兩個(gè)構(gòu)造函數(shù),每一個(gè)都需要一個(gè)字符數(shù)組提供數(shù)據(jù)源。 CharArrayReader(char array ) CharArrayReader(char array , int start, int numChars) 這里,array是輸入源。第二個(gè)構(gòu)造函數(shù)從字符數(shù)組的子集創(chuàng)建了一個(gè)Reader,該子集以start指定的索引開(kāi)始,長(zhǎng)度為numChars。教材P255頁(yè)的例子用到了上述CharArrayReader的兩個(gè)構(gòu)造函數(shù)。,5CharArrayReader類,CharArrayWriter 實(shí)現(xiàn)了以數(shù)組作為目標(biāo)的輸出流。CharArrayWriter 有兩個(gè)構(gòu)造函數(shù)。 CharArrayWriter() CharArrayWriter(int numChars) 第一種形式,創(chuàng)建了一個(gè)默認(rèn)長(zhǎng)度的緩沖器;第二種形式,緩沖器長(zhǎng)度由numChars指定。緩沖器保存在CharArrayWriter的buf 成員中。緩沖器大小在需要的情況下可以自動(dòng)增長(zhǎng)。緩沖器保持的字符數(shù)包含在CharArrayWriter的count 成員中。buf 和count 都是受保護(hù)的域。 教材P256頁(yè)的例子演示了CharArrayWriter的使用。,6CharArrayWriter類,BufferedReader通過(guò)緩沖輸入提高性能,它有兩個(gè)構(gòu)造函數(shù): BufferedReader(Reader inputStream) BufferedReader(Reader inputStream, int bufSize) 第一種形式創(chuàng)建一個(gè)默認(rèn)緩沖器長(zhǎng)度的緩沖字符流;第二種形式,緩沖器長(zhǎng)度由bufSize傳入。和字節(jié)流的情況相同,緩沖一個(gè)輸入字符流,Java同樣支持并提供緩沖器中流內(nèi)的反向移動(dòng)機(jī)制。為支持這點(diǎn),BufferedReader實(shí)現(xiàn)了mark( )和reset( )方法,并且Buffered Reader.mark Supported()返回true。教材P257頁(yè)的例子改寫(xiě)了前面的BufferedInputStream例子,它用一個(gè)BufferedReader字符流而不是用一個(gè)緩沖字節(jié)流。,7BufferedReader類,BufferedWriter是一個(gè)增加了flush( )方法的Writer。flush( )方法可以用來(lái)確保數(shù)據(jù)緩沖器確實(shí)被寫(xiě)到實(shí)際的輸出流。用BufferedWriter 可以通過(guò)減小數(shù)據(jù)被實(shí)際地寫(xiě)到輸出流的次數(shù)而提高程序的性能。 BufferedWriter類有下面的兩個(gè)構(gòu)造函數(shù): BufferedWriter(Writer outputStream) BufferedWriter(Writer outputStream, int bufSize) 第一種形式創(chuàng)建了使用默認(rèn)大小緩沖器的緩沖流;第二種形式中,緩沖器大小是由bufSize參數(shù)傳入的。,8BufferedWriter類,PushbackReader類允許一個(gè)或多個(gè)字符被送回輸入流,這使你可以對(duì)輸入流進(jìn)行預(yù)測(cè)。下面是它的兩個(gè)構(gòu)造函數(shù): PushbackReader(Reader inputStream) PushbackReader(Reader inputStream, int bufSize) 第一種形式創(chuàng)建了一個(gè)允許單個(gè)字節(jié)被推回的緩沖流;第二種形式,推回緩沖器的字符流大小由bufSize參數(shù)傳入。 PushbackReader提供了unread()方法,該方法返回一個(gè)或多個(gè)字符到調(diào)用的輸入流。它有下面的三種形式: void unread(int ch) void unread(char buffer ) void unread(char buffer , int offset, int numChars) 第一種形式推回ch傳入的字符。它是被并發(fā)調(diào)用的read()返回的下一個(gè)字符;第二種形式返回buffer中的字符;第三種形式推回buffer中從offset開(kāi)始的numChars個(gè)字符。如果在推回緩沖器為滿的條件下試圖返回一個(gè)字符,一個(gè)IOException異常將被引發(fā)。分析教材P259頁(yè)的例子。,9PushbackReader類,PrintWriter本質(zhì)上是PrintStream的字符形式的版本,它提供格式化的輸出方法print()和println()。PrintWriter有下面的4個(gè)構(gòu)造函數(shù): PrintWriter(OutputStream outputStream) PrintWriter(OutputStream outputStream, boolean flushOnNewline) PrintWriter(Writer outputStream) PrintWriter(Writer outputStream, boolean flushOnNewline) flushOnNewline控制Java是否在每次輸出換行符(n)時(shí)刷新輸出流。若flushOnNewline為true,刷新自動(dòng)發(fā)生;若為false,不進(jìn)行自動(dòng)刷新。第一個(gè)和第三個(gè)構(gòu)造函數(shù)不能進(jìn)行自動(dòng)刷新。,10PrintWriter類,Return,Return,10.5 文件的讀寫(xiě),10.5.1 如何進(jìn)行文件讀寫(xiě) 10.5.2 File類 10.5.3 目錄,前面我們?cè)谠S多地方都已經(jīng)接觸到了文件的讀寫(xiě)問(wèn)題,但不是很系統(tǒng)。在本節(jié)里,將對(duì)文件的讀寫(xiě)問(wèn)題作一個(gè)集中的說(shuō)明介紹。,10.5.1如何進(jìn)行文件讀寫(xiě),Java為編程人員提供了一系列的讀寫(xiě)文件的類和方法。在Java中,所有的文件都是字節(jié)形式的。Java提供了從文件讀寫(xiě)字節(jié)的方法,而且允許在字符形式的對(duì)象中使用字節(jié)文件流。這些在前面已作描述。兩個(gè)最常用的流類是FileInputStream和FileOutputStream,它們生成與文件鏈接的字節(jié)流。為打開(kāi)文件,只需創(chuàng)建這些類中某一個(gè)類的一個(gè)對(duì)象,在構(gòu)造函數(shù)中以參數(shù)形式指定文件的名稱。這兩個(gè)類都支持其他形式的重載構(gòu)造函數(shù)。下面是我們將要用到的形式: FileInputStream(String fileName) throws FileNotFoundException FileOutputStream(String fileName) throws FileNotFoundException 這里,fileName指定需要打開(kāi)的文件名。當(dāng)你創(chuàng)建了一個(gè)輸入流而文件不存在時(shí),引發(fā)FileNotFoundException異常。對(duì)于輸出流,如果文件不能生成,則引發(fā)FileNotFound Exception異常。如果一個(gè)輸出文件被打開(kāi),所有原先存在的同名的文件被破壞。 當(dāng)對(duì)文件的操作結(jié)束后,需要調(diào)用close()來(lái)關(guān)閉文件。該方法在FileInputStream和FileOutputStream中都有定義,具體形式如下。 void close() throws IOException 為讀文件,可以使用在FileInputStream中定義的read()方法,形式如下。 int read() throws IOException 該方法每次被調(diào)用,它僅從文件中讀取一個(gè)字節(jié)并將該字節(jié)以整數(shù)形式返回。當(dāng)讀到文件尾時(shí),read()返回-1。該方法可以引發(fā)IOException異常。 教材P260頁(yè)的程序使用read()來(lái)輸入和顯示文本文件的內(nèi)容。該文件名以命令行形式指定。教材P261頁(yè)的例子用write()拷貝一個(gè)文本文件。,Return,10.5.2 File類,盡管java.io定義的大多數(shù)類是實(shí)行流式操作的,但File類不是,它直接處理文件和文件系統(tǒng)。也就是說(shuō),F(xiàn)ile類沒(méi)有指定信息怎樣從文件讀取或向文件存儲(chǔ);它描述了文件本身的屬性。File對(duì)象用來(lái)獲取或處理與磁盤文件相關(guān)的信息,例如權(quán)限、時(shí)間、日期和目錄路徑。此外,F(xiàn)ile還瀏覽子目錄層次結(jié)構(gòu)。 很多程序中文件是數(shù)據(jù)的根源和目標(biāo)。盡管它們?cè)谛?yīng)用程序中因?yàn)榘踩蚨艿絿?yán)格限制,文件仍是存儲(chǔ)固定和共享信息的主要資源。Java中的目錄當(dāng)成File 對(duì)待,它具有附加的屬性:一個(gè)可以被list()方法檢測(cè)的文件名列表。 下面的構(gòu)造函數(shù)可以用來(lái)生成File對(duì)象。 File(String directoryPath) File(String directoryPath, String filename) File(File dirObj, Stri
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- WPS報(bào)表生成與分析技巧試題及答案
- Msoffice使用小竅門的總結(jié)與提升進(jìn)階試題及答案
- 綜合國(guó)力對(duì)經(jīng)濟(jì)競(jìng)爭(zhēng)的影響試題及答案
- 工業(yè)企業(yè)搬遷2025年社會(huì)穩(wěn)定風(fēng)險(xiǎn)評(píng)估與風(fēng)險(xiǎn)評(píng)估人才培養(yǎng)報(bào)告
- 數(shù)字經(jīng)濟(jì)2025年稅法考試試題及答案
- 養(yǎng)鴨場(chǎng)設(shè)備選型、設(shè)施建設(shè)與采購(gòu)計(jì)劃
- 2025年邏輯題型分析試題及答案
- 幼兒教育軟件助力個(gè)性化教學(xué)案例分享
- 2025年稅法備考心態(tài)試題及答案
- 游樂(lè)園環(huán)境保護(hù)措施與可持續(xù)發(fā)展規(guī)劃
- 農(nóng)行反洗錢與制裁合規(guī)知識(shí)競(jìng)賽考試題庫(kù)大全-上下
- DGTJ08-202-2020鉆孔灌注樁施工規(guī)程 上海市
- 拆遷協(xié)議中的貸款合同
- 河北省中原名校2025屆高考化學(xué)押題試卷含解析
- 小學(xué)學(xué)生體質(zhì)健康監(jiān)測(cè)管理制度
- 輕鋼龍骨隔墻施工方案
- 2025年面包烘培考試試題及答案
- 2025年社會(huì)工作者職業(yè)水平考試中級(jí)實(shí)務(wù)模擬試卷:社會(huì)工作專業(yè)能力與團(tuán)隊(duì)協(xié)作能力試題
- 肝陽(yáng)上亢的中醫(yī)護(hù)理查房
- 全國(guó)公開(kāi)課一等獎(jiǎng)人教版小學(xué)數(shù)學(xué)五年級(jí)下冊(cè)《數(shù)學(xué)廣角-找次品》課件
- 2022年高中物理同步講義(選修性必修3)第11講-熱力學(xué)第一定律(原卷版)
評(píng)論
0/150
提交評(píng)論