




已閱讀5頁,還剩24頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
Return,第10章輸入與輸出,10.1 Java輸入/輸出基礎(chǔ) 10.2 讀取控制臺輸入 10.3 向控制臺寫輸出 10.4 流類 10.5 文件的讀寫,在Java語言中,輸入與輸出完全基于“流”這個(gè)概念。Java輸入輸出的流式接口為復(fù)雜而繁重的I/O編程任務(wù)提供了一個(gè)簡潔的抽象。本章將對這方面的內(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的輸入/輸出問題我們在前面的程序代碼中一般都接觸過,只是沒有系統(tǒng)地進(jìn)行討論。本節(jié)將對Java的輸入/輸出問題作一個(gè)概述。,10.1.1流的概念,我們知道,多數(shù)程序在不獲取外部數(shù)據(jù)的情況下不能順利完成目標(biāo)。數(shù)據(jù)從一個(gè)輸入源獲得,程序的結(jié)果被送到輸出目的地。在Java中,這些源和目的地被廣泛地定義。例如一個(gè)網(wǎng)絡(luò)連接器,內(nèi)存緩沖區(qū)或磁盤文件可以被Java輸入/輸出類熟練地操作。盡管從物理意義上很難說明,這些外設(shè)都由相同的抽象體流(stream)來處理。流是一個(gè)生產(chǎn)或消費(fèi)信息的邏輯實(shí)體,它通過Java輸入/輸出系統(tǒng)與物理設(shè)備相連。盡管與之相連的實(shí)際物理設(shè)備各不相同,但是所有的流都以同樣的方式運(yùn)轉(zhuǎn)。 Java程序通過流來完成輸入/輸出,它是生產(chǎn)或消費(fèi)信息的抽象。流通過Java的輸入/輸出系統(tǒng)與物理設(shè)備鏈接。盡管與它們鏈接的物理設(shè)備不盡相同,但是所有流的行為具有同樣的方式。這樣,相同的輸入/輸出類和方法適用于所有類型的外部設(shè)備。這意味著一個(gè)輸入流能夠抽象多種不同類型的輸入:從磁盤文件,從鍵盤或從網(wǎng)絡(luò)套接字。同樣,一個(gè)輸出流可以輸出到控制臺,磁盤文件或相連的網(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é)流讀取或書寫二進(jìn)制數(shù)據(jù)。字符流(character stream)為字符的輸入和輸出處理提供了方便。這兩種流采用了統(tǒng)一的編碼標(biāo)準(zhǔn),因而可以國際化。當(dāng)然,在某些場合字符流比字節(jié)流更為有效。 在Java的早期版本(Java 1.0)中不包括字符流,因此所有的輸入和輸出都是以字節(jié)為單位的。后來,Java 1.1中加入了字符流,某些字節(jié)形式的類和方法不被推薦使用。這也是為什么沒用字符流的老代碼在適當(dāng)?shù)牡胤叫枰碌脑颉?需要說明的是,在最底層,所有的輸入/輸出都是字節(jié)形式的?;谧址牧髦皇菫樘幚碜址峁┓奖阌行У姆椒?。 下面對字節(jié)流和字符流分別作簡要介紹。,字節(jié)流由兩個(gè)類層次結(jié)構(gòu)定義。在頂層有兩個(gè)抽象類:InputStream 和 OutputStream。每個(gè)抽象類都有多個(gè)具體的子類,這些子類對不同的外設(shè)進(jìn)行處理,例如磁盤文件、網(wǎng)絡(luò)連接、甚至是內(nèi)存緩沖區(qū)。各種字節(jié)流類及其相關(guān)說明見教材P235頁。,1字節(jié)流類,字符流類由兩個(gè)類層次結(jié)構(gòu)定義。頂層有兩個(gè)抽象類:Reader和Writer。這些抽象類處理統(tǒng)一編碼的字符流。在Java中這些類含有多個(gè)具體的子類詳見教材P235236頁。,2字符流類,Return,10.1.3預(yù)定義流,我們已經(jīng)知道,所有的Java程序運(yùn)行時(shí)自動導(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對象而被用于程序的其他部分。 System.out是標(biāo)準(zhǔn)的輸出流,在默認(rèn)情況下它是一個(gè)控制臺;System.in是標(biāo)準(zhǔn)輸入,默認(rèn)情況下指的是鍵盤;System.err指的是標(biāo)準(zhǔn)錯(cuò)誤流,它默認(rèn)是控制臺。需要指出的是,這些流可以重定向到任何兼容的輸入/輸出設(shè)備。 System.in是InputStream的對象;System.out和System.err是PrintStream的對象。盡管它們是用來讀寫外設(shè)字符的,它們都是字節(jié)流。如果編程人員愿意,可以用基于字符的流來包裝它們。在前面章節(jié)中多次用到過System.out,我們可以同樣的方式使用System.err。System.in的使用則稍微復(fù)雜一些。,Return,10.1.4 Java輸入/輸出類和接口,在Java 2中,java.io包定義的輸入/輸出類見教材P236237頁。不難發(fā)現(xiàn),其中包含了前面所介紹的字節(jié)流和字符流。其中,ObjectInputStream.GetField和ObjectOutputStream.PutField是Java 2中新添的內(nèi)部類。對于Java 2不推薦使用的兩個(gè)類LineNumber InputStream和StringBufferInputStream,上面沒有列出。雖然java.io中予以保留,但一般情況下不應(yīng)使用。 由java.io定義的接口見教材237頁。其中,F(xiàn)ileFilter接口是Java 2中新增的。 從以上介紹不難發(fā)現(xiàn),java.io包中有很多的類和接口,包括各種字節(jié)流、字符流、對象序列化(對象的存儲和釋放)。后面我們將介紹其中一些最常用的I/O成員。,Return,Return,10.2 讀取控制臺輸入,10.2.1如何讀取控制臺輸入 10.2.2讀取字符 10.2.3讀取字符串,在本節(jié)中,我們將介紹Java如何讀取控制臺輸入的有關(guān)問題。,10.2.1如何讀取控制臺輸入,在Java 1.0中,完成控制臺輸入的唯一途徑是字節(jié)流,這種方法現(xiàn)在依舊可用。但是,這種做法不值得推薦。在Java 2中,讀取控制臺輸入的首選方法應(yīng)該是字符流,它使程序容易符合國際標(biāo)準(zhǔn),并且易于維護(hù)。 在Java中,控制臺輸入由從System.in讀取數(shù)據(jù)來完成。為獲得屬于控制臺的字符流,在BufferedReader對象中包裝了System.in。BufferedReader支持緩沖輸入流,它最常見的構(gòu)造函數(shù)如下: BufferedReader(Reader inputReader) 其中,inputReader是鏈接被創(chuàng)建的BufferedReader實(shí)例的流。Reader是一個(gè)抽象類,它的一個(gè)具體的子類是InputStreamReader,該子類將字節(jié)轉(zhuǎn)換成字符。為獲得鏈接System.in的一個(gè)InputStreamReader的對象,使用下面的構(gòu)造函數(shù): InputStreamReader(InputStream inputStream) 由于System.in引用了InputStream 類型的對象,它可以用于inputStream。綜上所述,下面的代碼創(chuàng)建了與鍵盤相連的BufferedReader對象。 BufferedReader br = new BufferedReader(new InputStreamReader(System.in); 當(dāng)該語句執(zhí)行后,br是通過System.in生成的鏈接控制臺的字符流。,Return,10.2.2讀取字符,要從BufferedReader讀取字符,用read()。例如: int read( ) throws IOException 該方法每次執(zhí)行都從輸入流讀取一個(gè)字符,然后以整型形式返回。當(dāng)遇到流的末尾時(shí),它返回-1??梢钥吹?,它要引發(fā)一個(gè)IOException異常。 分析教材P238頁的例子。,Return,10.2.3讀取字符串,從鍵盤讀取字符串,使用readLine()方法,它是BufferedReader 類的成員。這個(gè)方法的一般使用形式如下。 String readLine() throws IOException 該方法返回一個(gè)String對象。 例如,教材P239頁的程序可生成一個(gè)小文本編輯器。它創(chuàng)建了一個(gè)String對象的數(shù)組,然后依行讀取文本,將文本的每一行存入到數(shù)組中。當(dāng)它讀到100行或輸入“stop”時(shí)才停止。該例程使用一個(gè)BufferedReader類來從控制臺讀取數(shù)據(jù)。,Return,Return,10.3 向控制臺寫輸出,10.3.1 如何向控制臺寫輸出 10.3.2 PrintWriter類,在前面章節(jié)中我們接觸過的控制臺輸出方式有print()和println()等簡單途徑,這兩種方法由PrintStream(System.out引用的對象類型)定義。本節(jié)介紹如何進(jìn)行控制臺寫輸出。,10.3.1如何向控制臺寫輸出,因?yàn)镻rintStream是從OutputStream派生的輸出流,它同樣實(shí)現(xiàn)低級方法write()。write()可用來向控制臺寫數(shù)據(jù),PrintStream定義的write()的最簡單形式是:void write(int byteval) 該方法按照byteval指定的數(shù)向文件寫字節(jié)。盡管byteval定義成整數(shù),但只有低位的8個(gè)字節(jié)被寫入。下面的例程用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()來完成向控制臺的輸出,盡管在某些場合很有效。相比來說print()和println()方法更容易使用。,Return,10.3.2 PrintWriter 類,盡管Java允許使用System.out向控制臺寫數(shù)據(jù),但建議僅用于調(diào)試程序時(shí)。對于實(shí)際的程序,Java推薦的向控制臺寫數(shù)據(jù)的方法是用PrintWriter流。PrintWriter是基于字符的類,用基于字符的類向控制臺寫數(shù)據(jù)使程序更為國際化。 PrintWriter定義了多個(gè)構(gòu)造函數(shù),我們所用到的一個(gè)如下。 PrintWriter(OutputStream outputStream, boolean flushOnNewline) 這里,outputStream是OutputStream類的對象,flushOnNewline控制Java是否在println( )方法被調(diào)用時(shí)刷新輸出流。如果flushOnNewline為true,刷新自動發(fā)生,若為false,則不發(fā)生。 PrintWriter支持所有類型(包括Object)的print()和println()方法,這樣,我們就可以像用System.out那樣用這些方法。如果遇到不同類型的情況,PrintWriter方法調(diào)用對象的toString()方法并打印結(jié)果。 用PrintWriter向外設(shè)寫數(shù)據(jù),指定輸出流為System.out,并在每一新行后刷新流。教材P241頁的代碼創(chuàng)建了與控制臺輸出相連的PrintWriter類。,Return,Return,10.4 流類,10.4.1字節(jié)流 10.4.2字符流,前面我們簡單介紹了控制臺的輸入/輸出,下面我們具體介紹各種流類。Java 的流式輸入/輸出建立在4個(gè)抽象類的基礎(chǔ)上:InputStream、OutputStream、Reader和Writer。這些類在前面已經(jīng)提到過,它們用來創(chuàng)建具體流式子類。盡管程序通過具體子類執(zhí)行輸入/輸出操作,頂層的類定義了所有流類的基礎(chǔ)通用功能。 我們已經(jīng)知道,InputStream和OutputStream設(shè)計(jì)成字節(jié)流類,而Reader和Writer為字符流設(shè)計(jì)。字節(jié)流類和字符流類形成分離的層次結(jié)構(gòu)。一般說來,處理字符或字符串時(shí)應(yīng)使用字符流類,處理字節(jié)或二進(jìn)制對象時(shí)應(yīng)使用字節(jié)流類。下面分別介紹字節(jié)流和字符流類。,10.4.1字節(jié)流,字節(jié)流類為處理字節(jié)式輸入/輸出提供了豐富的環(huán)境,一個(gè)字節(jié)流可以和其他任何類型的對象并用,包括二進(jìn)制數(shù)據(jù)。這樣的多功能性使得字節(jié)流對很多類型的程序都很重要。由于字節(jié)流類以InputStream 和OutputStream為頂層,我們就從討論這兩個(gè)類開始。,InputStream是一個(gè)定義了Java流式字節(jié)輸入模式的抽象類,該類的所有方法在出錯(cuò)條件下引發(fā)一個(gè)IOException 異常。InputStream的各種方法見教材P242頁。,1InputStream(輸入流),OutputStream是定義了流式字節(jié)輸出模式的抽象類,該類的所有方法返回一個(gè)void 值并且在出錯(cuò)情況下引發(fā)一個(gè)IOException異常。OutputStream的各種方法見教材P242頁。,2OutputStream(輸出流),FileInputStream 類創(chuàng)建一個(gè)能從文件讀取字節(jié)的InputStream 類,它的兩個(gè)常用的構(gòu)造函數(shù)如下: FileInputStream(String filepath) FileInputStream(File fileObj) 它們都能引發(fā)FileNotFoundException異常。這里,filepath 是文件的全稱路徑,fileObj是描述該文件的File對象。 分析教材P243頁的例子。,3FileInputStream(文件輸入流),FileOutputStream 創(chuàng)建了一個(gè)可以向文件寫入字節(jié)的類OutputStream,它常用的構(gòu)造函數(shù)如下: FileOutputStream(String filePath) FileOutputStream(File fileObj) FileOutputStream(String filePath, boolean append) 它們可以引發(fā)IOException或SecurityException異常。這里,filePath是文件的全稱路徑,fileObj是描述該文件的File對象。如果append為true,文件以設(shè)置搜索路徑模式打開。 FileOutputStream的創(chuàng)建不依賴于文件是否存在。在創(chuàng)建對象時(shí)FileOutputStream在打開輸出文件之前創(chuàng)建它。這種情況下,如果試圖打開一個(gè)只讀文件,將會引發(fā)一個(gè) IOException異常。教材P244245頁的例子用于創(chuàng)建一個(gè)樣本字節(jié)緩沖器。,4FileOutputStream(文件輸出流),RandomAccessFile包裝了一個(gè)隨機(jī)訪問的文件,注意它不是派生于InputStream和OutputStream,而是實(shí)現(xiàn)了基本輸入/輸出方法的DataInput和DataOutput接口。它同樣支持定位請求,也就是說可以在文件內(nèi)部放置文件指針。它有兩個(gè)構(gòu)造函數(shù): RandomAccessFile(File fileObj, String access) throws FileNotFoundException RandomAccessFile(String filename, String access)throws FileNotFound Exception 第一種形式,fileObj指定了作為File 對象打開的文件的名稱;第二種形式,文件名是由filename參數(shù)傳入的。兩種情況下,access 都決定允許訪問何種文件類型。如果是“r”,那么文件可讀不可寫,如果是“rw”,文件以讀寫模式打開。,5RandomAccessFile(隨機(jī)訪問文件類),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),長度由numBytes決定。教材P246頁的例子創(chuàng)建了兩個(gè)ByteArrayInputStream對象,并用字母表的字節(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 成員里。緩沖器的大小在需要的情況下會自動增加。緩沖器保存的字節(jié)數(shù)是由ByteArrayOutput Stream的受保護(hù)的count域保存的。教材P247頁的例程演示了ByteArrayOutputStream的使用。,7ByteArrayOutputStream(字節(jié)數(shù)組輸出流),過濾流(filtered stream)僅僅是底層透明地提供擴(kuò)展功能的輸入流(輸出流)的包裝。這些流一般由普通類的方法訪問。典型的擴(kuò)展是緩沖,字符轉(zhuǎn)換和原始數(shù)據(jù)轉(zhuǎn)換。這些過濾字節(jié)流是FilterInputStream 和FilterOutputStream。它們的構(gòu)造函數(shù)分別如下。 FilterOutputStream(OutputStream os) FilterInputStream(InputStream is) 這些類提供的方法和InputStream 及OutputStream類的方法相同。,8過濾字節(jié)流,對于字節(jié)流,緩沖流(buffered stream)是一種字節(jié)流,通過把內(nèi)存緩沖器連到輸入/輸出流而擴(kuò)展一個(gè)過濾流類。該緩沖器允許Java對多個(gè)字節(jié)同時(shí)進(jìn)行輸入/輸出操作,提高了程序性能。因?yàn)榫彌_器可用,所以可以跳過、標(biāo)記和重新設(shè)置流。緩沖字節(jié)流類是BufferedInputStream 和BufferedOutputStream。PushbackInputStream 也可實(shí)現(xiàn)緩沖流。詳細(xì)情況見教材P248251頁的介紹。,9緩沖字節(jié)流,10SequenceInputStream(順序輸入流),SequenceInputStream類允許連接多個(gè)InputStream流,這個(gè)類的構(gòu)造不同于任何其他的InputStream。SequenceInputStream構(gòu)造函數(shù)要么使用一對InputStream,要么用InputStream的一個(gè)Enumeration,一般形式如下: SequenceInputStream(InputStream first, InputStream second) SequenceInputStream(Enumeration streamEnum) 從操作上來講,該類滿足讀取完第一個(gè)InputStream后轉(zhuǎn)去讀取第二個(gè)流的讀取要求。使用Enumeration的情況下,它將繼續(xù)讀取所有InputStream流直到最后一個(gè)被讀完。分析教材P251252頁的示例。,PrintStream具有我們在System文件句柄使用過的System.out所有的格式化性能。PrintStream有兩個(gè)構(gòu)造函數(shù): PrintStream(OutputStream outputStream) PrintStream(OutputStream outputStream, boolean flushOnNewline) 當(dāng)flushOnNewline控制Java每次刷新輸出流時(shí),輸出一個(gè)換行符(n)。如果flushOnNewline為true,自動刷新;若為false,刷新不能自動進(jìn)行。第一個(gè)構(gòu)造函數(shù)不支持自動刷新。Java的PrintStream對象支持包括Object在內(nèi)的各種類型的print()和println()方法。如果參數(shù)不是一個(gè)簡單類型,PrintStream方法將調(diào)用對象的toString()方法,然后打印結(jié)果。,11PrintStream(打印流),Return,盡管字節(jié)流提供了處理任何類型輸入/輸出操作的足夠的功能,它們不能直接操作Unicode字符。既然Java的主要目標(biāo)是支持“只寫一次,到處運(yùn)行”的信念,包括直接的字符輸入輸出支持是必要的。本節(jié)將討論幾個(gè)字符輸入輸出類。如前所述,字符流層次結(jié)構(gòu)的頂層是Reader和Writer抽象類,下面從這兩個(gè)類開始介紹。,10.4.2 字符流,Reader是定義Java的流式字符輸入模式的抽象類,該類的所有方法在出錯(cuò)情況下都將引發(fā)IOException 異常。教材P253頁給出了Reader類中的各種方法。,1Reader類,Writer是定義流式字符輸出的抽象類,所有該類的方法都返回一個(gè)void 值并在出錯(cuò)條件下引發(fā)IOException 異常。教材P253頁給出了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 對象。教材P254頁的例子演示了怎樣從一個(gè)文件逐行讀取并把它輸出到標(biāo)準(zhǔn)輸入流。,3FileReader類,FileWriter創(chuàng)建一個(gè)可以寫文件的Writer 類,它最常用的構(gòu)造函數(shù)形式如下 FileWriter(String filePath) FileWriter(String filePath, boolean append) FileWriter(File fileObj) 它們可以引發(fā)IOException或者SecurityException異常。在這里,filePath是文件的完全路徑,fileObj是描述該文件的File對象。如果append為true,輸出是附加到文件尾的。 FileWriter類的創(chuàng)建不依賴于文件存在與否。在創(chuàng)建文件之前,F(xiàn)ileWriter將在創(chuàng)建對象時(shí)打開它來作為輸出。如果試圖打開一個(gè)只讀文件,將引發(fā)一個(gè)IOException異常。教材P254255頁的例子是對前面討論FileOutputStream時(shí)用到例子的字符流形式的版本。它創(chuàng)建了一個(gè)樣本字符緩沖器,開始生成一個(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指定的索引開始,長度為numChars。教材P255頁的例子用到了上述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)長度的緩沖器;第二種形式,緩沖器長度由numChars指定。緩沖器保存在CharArrayWriter的buf 成員中。緩沖器大小在需要的情況下可以自動增長。緩沖器保持的字符數(shù)包含在CharArrayWriter的count 成員中。buf 和count 都是受保護(hù)的域。 教材P256頁的例子演示了CharArrayWriter的使用。,6CharArrayWriter類,BufferedReader通過緩沖輸入提高性能,它有兩個(gè)構(gòu)造函數(shù): BufferedReader(Reader inputStream) BufferedReader(Reader inputStream, int bufSize) 第一種形式創(chuàng)建一個(gè)默認(rèn)緩沖器長度的緩沖字符流;第二種形式,緩沖器長度由bufSize傳入。和字節(jié)流的情況相同,緩沖一個(gè)輸入字符流,Java同樣支持并提供緩沖器中流內(nèi)的反向移動機(jī)制。為支持這點(diǎn),BufferedReader實(shí)現(xiàn)了mark( )和reset( )方法,并且Buffered Reader.mark Supported()返回true。教材P257頁的例子改寫了前面的BufferedInputStream例子,它用一個(gè)BufferedReader字符流而不是用一個(gè)緩沖字節(jié)流。,7BufferedReader類,BufferedWriter是一個(gè)增加了flush( )方法的Writer。flush( )方法可以用來確保數(shù)據(jù)緩沖器確實(shí)被寫到實(shí)際的輸出流。用BufferedWriter 可以通過減小數(shù)據(jù)被實(shí)際地寫到輸出流的次數(shù)而提高程序的性能。 BufferedWriter類有下面的兩個(gè)構(gòu)造函數(shù): BufferedWriter(Writer outputStream) BufferedWriter(Writer outputStream, int bufSize) 第一種形式創(chuàng)建了使用默認(rèn)大小緩沖器的緩沖流;第二種形式中,緩沖器大小是由bufSize參數(shù)傳入的。,8BufferedWriter類,PushbackReader類允許一個(gè)或多個(gè)字符被送回輸入流,這使你可以對輸入流進(jìn)行預(yù)測。下面是它的兩個(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開始的numChars個(gè)字符。如果在推回緩沖器為滿的條件下試圖返回一個(gè)字符,一個(gè)IOException異常將被引發(fā)。分析教材P259頁的例子。,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,刷新自動發(fā)生;若為false,不進(jìn)行自動刷新。第一個(gè)和第三個(gè)構(gòu)造函數(shù)不能進(jìn)行自動刷新。,10PrintWriter類,Return,Return,10.5 文件的讀寫,10.5.1 如何進(jìn)行文件讀寫 10.5.2 File類 10.5.3 目錄,前面我們在許多地方都已經(jīng)接觸到了文件的讀寫問題,但不是很系統(tǒng)。在本節(jié)里,將對文件的讀寫問題作一個(gè)集中的說明介紹。,10.5.1如何進(jìn)行文件讀寫,Java為編程人員提供了一系列的讀寫文件的類和方法。在Java中,所有的文件都是字節(jié)形式的。Java提供了從文件讀寫字節(jié)的方法,而且允許在字符形式的對象中使用字節(jié)文件流。這些在前面已作描述。兩個(gè)最常用的流類是FileInputStream和FileOutputStream,它們生成與文件鏈接的字節(jié)流。為打開文件,只需創(chuàng)建這些類中某一個(gè)類的一個(gè)對象,在構(gòu)造函數(shù)中以參數(shù)形式指定文件的名稱。這兩個(gè)類都支持其他形式的重載構(gòu)造函數(shù)。下面是我們將要用到的形式: FileInputStream(String fileName) throws FileNotFoundException FileOutputStream(String fileName) throws FileNotFoundException 這里,fileName指定需要打開的文件名。當(dāng)你創(chuàng)建了一個(gè)輸入流而文件不存在時(shí),引發(fā)FileNotFoundException異常。對于輸出流,如果文件不能生成,則引發(fā)FileNotFound Exception異常。如果一個(gè)輸出文件被打開,所有原先存在的同名的文件被破壞。 當(dāng)對文件的操作結(jié)束后,需要調(diào)用close()來關(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頁的程序使用read()來輸入和顯示文本文件的內(nèi)容。該文件名以命令行形式指定。教材P261頁的例子用write()拷貝一個(gè)文本文件。,Return,10.5.2 File類,盡管java.io定義的大多數(shù)類是實(shí)行流式操作的,但File類不是,它直接處理文件和文件系統(tǒng)。也就是說,F(xiàn)ile類沒有指定信息怎樣從文件讀取或向文件存儲;它描述了文件本身的屬性。File對象用來獲取或處理與磁盤文件相關(guān)的信息,例如權(quán)限、時(shí)間、日期和目錄路徑。此外,F(xiàn)ile還瀏覽子目錄層次結(jié)構(gòu)。 很多程序中文件是數(shù)據(jù)的根源和目標(biāo)。盡管它們在小應(yīng)用程序中因?yàn)榘踩蚨艿絿?yán)格限制,文件仍是存儲固定和共享信息的主要資源。Java中的目錄當(dāng)成File 對待,它具有附加的屬性:一個(gè)可以被list()方法檢測的文件名列表。 下面的構(gòu)造函數(shù)可以用來生成File對象。 File(String directoryPath) File(String directoryPath, String filename) File(File dirObj, Stri
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 智能家居廠房抵押貸款合同
- 財(cái)務(wù)總監(jiān)職位競聘與績效獎金合同
- 餐飲企業(yè)服務(wù)員定期評估雇傭合同
- 手術(shù)的護(hù)理診斷
- 武術(shù)介紹課件
- 武曉紅稅務(wù)老師課件
- 2025年農(nóng)產(chǎn)品購銷協(xié)議
- 危險(xiǎn)品倉庫管理培訓(xùn)
- 培訓(xùn)學(xué)校管理制度
- 古代詩歌閱讀高頻考點(diǎn)沖刺練(含答案)-2025屆高考語文三輪復(fù)習(xí)
- 炊事員安全試題及答案
- 計(jì)算機(jī)基礎(chǔ)考試知識試題及答案集
- 2025年下半年北京市昌平區(qū)東小口鎮(zhèn)招聘擬聘用易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 馬幫運(yùn)輸協(xié)議書
- 山東省棗莊市市中學(xué)區(qū)五校聯(lián)考2025屆七年級數(shù)學(xué)第二學(xué)期期末考試模擬試題含解析
- 2025年中考道德與法治三輪沖刺:人工智能+文化建設(shè) 考題含答案
- 數(shù)字智慧方案未來醫(yī)院智慧孿生和空間創(chuàng)新
- 福建廈門雙十中學(xué)2025屆物理八下期末質(zhì)量跟蹤監(jiān)視試題含解析
- 2025年消防執(zhí)業(yè)資格考試題庫(消防應(yīng)急救援裝備)消防設(shè)備操作規(guī)程試題
- 制藥生產(chǎn)管理培訓(xùn)
- 安全生產(chǎn)事故案例分析
評論
0/150
提交評論