




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第九章Java輸入/輸出9.1輸入/輸出的基本概念9.2輸入/輸出類層次結(jié)構(gòu)9.3面向字節(jié)的輸入/輸出9.4面向字符輸入/輸出9.5其它輸入/輸出流9.6File類本章小結(jié)
9.1輸入/輸出的基本概念
Java是使用“流(Stream)”的概念來進(jìn)行輸入/輸出的?!傲鳌睂?shí)質(zhì)是Java預(yù)定義的對不同情況進(jìn)行輸入/輸出操作的類,“流”對象就是這些類產(chǎn)生的對象,在進(jìn)行輸入/輸出的時(shí)候就是由這些類產(chǎn)生的對象來完成相應(yīng)操作的。
9.1.1輸入與輸出
Java的輸入/輸出是指相對于程序而言,程序與外部進(jìn)行的數(shù)據(jù)輸入和輸出的操作。
程序中的輸入與輸出操作很常見,比如從鍵盤上讀取數(shù)據(jù)、從文件讀取數(shù)據(jù)、向文件寫出數(shù)據(jù)等。通過輸入與輸出操作,可以將程序中產(chǎn)生的數(shù)據(jù)輸出到外界,也可以從外界輸入數(shù)據(jù)到程序中,Java語言使用流對象來實(shí)現(xiàn)這些輸入/輸出操作,流對象對數(shù)據(jù)的輸入/輸出操作屏蔽了具體的細(xì)節(jié),讓Java程序員更為方便地操縱數(shù)據(jù)流向。
首先要明確輸入/輸出的方向:輸入/輸出一定是相對于程序而言的。
(1)相對于程序而言,數(shù)據(jù)是進(jìn)來的,就稱之為輸入/讀入(input/read)。
(2)相對于程序而言,數(shù)據(jù)是出去的,就稱之為輸出/寫出(output/write)。
如圖9-1所示,避免“讀出”、“寫入”這樣含糊不清的說法。
圖9-1Java相對于程序的輸入/輸出
9.1.2流對象
1.輸入流對象
可以將圖9-1中“程序”左邊的箭頭視為輸入流對象,有能力將數(shù)據(jù)輸入到程序中的對象,就可以視為輸入流對象。輸入流對象對應(yīng)數(shù)據(jù)源端,數(shù)據(jù)要從外部輸入到程序中,就要說明數(shù)據(jù)源端是什么、在哪里,然后該輸入流對象就采用相應(yīng)的輸入方法來將數(shù)據(jù)從數(shù)據(jù)源端輸入到程序。
2.輸出流對象
圖9-1中“程序”右邊的箭頭可以視為輸出流對象,有能力將數(shù)據(jù)輸出到程序外部的對象,就可以視為輸出流對象。輸出流對象對應(yīng)接收端,數(shù)據(jù)要從程序輸出到外部,就要說明接收端是什么、在哪里,然后輸出流對象采用相應(yīng)的輸出方法將數(shù)據(jù)從程序輸出到接收端。
3.緩沖流對象
以文件的輸入/輸出為例,內(nèi)存中的程序要和磁盤中的文件進(jìn)行數(shù)據(jù)輸入/輸出,然而二者速度不匹配,磁盤文件的操作比內(nèi)存的操作慢很多。顯然,在這樣的情況下每次輸入/輸出一個(gè)字節(jié)的效率是非常低的。為了提高數(shù)據(jù)的傳輸效率,通常使用緩沖流(BufferedStream)來提高數(shù)據(jù)的輸入/輸出效率。
4.字節(jié)流/字符流
進(jìn)行數(shù)據(jù)的輸入/輸出時(shí),需要確定數(shù)據(jù)輸入/輸出的基本單位是什么。
(1)字節(jié)流:即每次輸入/輸出是按字節(jié)進(jìn)行(1B?=?8bit)的。這種方式是最基本的輸入/輸出方式,能夠?qū)λ袛?shù)據(jù)進(jìn)行輸入/輸出(計(jì)算機(jī)中的所有數(shù)據(jù)是以0和1來存儲(chǔ)的)。字節(jié)流又被稱為二進(jìn)制字節(jié)流(binarybytestream)或位流(bitsstream)。
(2)字符流:字符流的基本單位是字符char,是針對字符優(yōu)化了的輸入/輸出。Java的char是采用2個(gè)字節(jié)的Unicode編碼,所以字符流一次輸入/輸出2個(gè)字節(jié),針對字符類型數(shù)據(jù)進(jìn)行輸入/輸出較為方便且效率高。
9.2輸入/輸出類層次結(jié)構(gòu)
為了便于程序員進(jìn)行輸入/輸出操作,屏蔽輸入/輸出的細(xì)節(jié),Java將相關(guān)輸入/輸出操作封裝在相應(yīng)的類中,這些類放置在java.io包里,如圖9-2所示。
圖9-2Java輸入/輸出類層次圖
在java.io包中有4個(gè)基本類,即InputStream、OutputStream及Reader、Writer類,它們分別處理字節(jié)流和字符流,根據(jù)數(shù)據(jù)源端和接收端的不同以及輸入/輸出方式的不同,它們下面還有若干子類。除了這4個(gè)基本類,另外還有File類以及隨機(jī)訪問文件類RandomAccessFile等。
9.3面向字節(jié)的輸入/輸出
InputStream和OutputStream類是Java中用來處理以字節(jié)(Byte)為單位的輸入/輸出流的,這兩個(gè)類下面還有更為具體的面向字節(jié)的輸入/輸出類,用以處理各種不同的輸入/輸出。還是以文件為例,它們可以處理二進(jìn)制文件(binaryfile)、文本文件、圖片聲音文件等等,所有文件在外部存儲(chǔ)器上都是以位和字節(jié)的方式存儲(chǔ)數(shù)據(jù)的,所以都可以使用面向字節(jié)的輸入/輸出流對各種文件進(jìn)行輸入/輸出(對于文本文件,使用下一節(jié)將介紹的面向字符的輸入/輸出流進(jìn)行操作更為方便)。
我們以文件的輸入/輸出為例進(jìn)行介紹,這也是最常見的輸入/輸出方式。對于文件,按字節(jié)的方式進(jìn)行輸入/輸出,主要將使用下面兩個(gè)類:
(1)?FileInputStream:面向字節(jié)的文件輸入流。
(2)?FileOutputStream:面向字節(jié)的文件輸出流。
9.3.1面向字節(jié)的文件輸入流
FileInputStream的主要方法如表9-1所示。
read()方法有以下三個(gè)重載形式:
(1)將數(shù)據(jù)源端的1個(gè)字節(jié)輸入到程序中。
(2)將數(shù)據(jù)源端的多個(gè)字節(jié)輸入到程序中(與數(shù)據(jù)源端字節(jié)多少、程序接收字節(jié)的byte數(shù)組大小有關(guān),一般情況下程序員控制二者相等)。
(3)將數(shù)據(jù)源端中指定的字節(jié)輸入到程序中(指定偏移量和字節(jié)數(shù))。
如何構(gòu)造FileInputStream類的對象呢?主要有兩種方式:
(1)通過String形式的文件路徑-文件名來構(gòu)造FileInputStream類對象。
(2)通過一個(gè)File類對象來構(gòu)造FileInputStream類對象(File類后面將詳細(xì)討論)。
程序結(jié)果:
9.3.2面向字節(jié)的文件輸出流
FileOutputStream的主要方法如表9-2所示。
從表9-2可以看出,F(xiàn)ileOutputStream的主要方法是write(),與FileInputStream類似,也是具有三個(gè)重載方法:
(1)將單個(gè)的字節(jié)寫出到輸出流對應(yīng)的接收端:
write(int
b)
(2)將byte數(shù)組的所有字節(jié)一次性輸出到接收端:
write(byte[]
b)
(3)將byte數(shù)組的指定字節(jié)輸出到接收端:
write(byte[]
b,int
off,int
len)
下面在上述程序的基礎(chǔ)上進(jìn)行下列操作:將d盤javaCode目錄下的a.jpg文件輸入到程序的b數(shù)組中,然后將b數(shù)組中的字節(jié)元素依次輸出到同目錄下的b.jpg文件中,這相當(dāng)于對文件的復(fù)制操作。
9.3.3帶緩沖的字節(jié)輸入/輸出流
對數(shù)據(jù)流的每次操作若都是以字節(jié)為單位進(jìn)行的,每次輸入/輸出一個(gè)字節(jié),效率將是非常低的。那么,如何提高輸入/輸出的效率?一個(gè)有效的解決方法就是以帶緩沖的方式來進(jìn)行輸入/輸出,將使用下面兩個(gè)類來完成:
(1)字節(jié)緩沖輸入流:BufferedInputStream。
(2)字節(jié)緩沖輸出流:BufferedOutputStream。
具體是先產(chǎn)生一個(gè)面向字節(jié)的文件輸入/輸出流對象,然后將該對象作為緩沖流構(gòu)造函數(shù)的參數(shù),從而“包裝”成一個(gè)緩沖流對象,使用該緩沖流對象進(jìn)行read和write操作就具有緩沖的方式,如圖9-3所示。
圖9-3“包裝”緩沖輸入/輸出對象
對文件按字節(jié)進(jìn)行輸入/輸出有以下幾種方式:
(1)采用循環(huán)一個(gè)一個(gè)字節(jié)地輸入/輸出。
(2)對(1)加緩沖輸入/輸出方式。
(3)使用byte數(shù)組作為參數(shù),一次性輸入/輸出多個(gè)字節(jié)。
(4)對(3)加緩沖輸入/輸出方式。
程序結(jié)果:
程序結(jié)果:
程序結(jié)果
程序結(jié)果:
9.3.4格式化輸入/輸出流
進(jìn)行輸入/輸出的主要是兩種單位,即字節(jié)、字符,但有時(shí)會(huì)希望一次輸入/輸出一個(gè)int整數(shù)數(shù)據(jù)(4字節(jié)),或者一個(gè)double數(shù)據(jù)(8字節(jié))等基本類型數(shù)據(jù),這種情況就可以使用下面兩個(gè)類來完成:
(1)格式化字節(jié)輸入流:DataInputStream。
(2)格式化字節(jié)輸出流:DataOutputStream。
如圖9-4所示,還是使用“包裝”的方式。圖9-4“包裝”格式化輸入/輸出對象
如圖9-4所示,先產(chǎn)生基本的輸入/輸出對象fin和fout,然后進(jìn)行“包裝”,產(chǎn)生格式化輸入/輸出流對象din和dout;使用din和dout對象就具有新的輸入/輸出方法,能夠按照各種基本數(shù)據(jù)類型進(jìn)行輸入/輸出,這就是格式化輸入/輸出。
下面先使用格式化字節(jié)輸出流輸出幾個(gè)基本數(shù)據(jù)到a.bat文件中,然后使用格式化字節(jié)輸入流來讀取這些基本數(shù)據(jù)。
(1)格式化字節(jié)輸出流:DataOutputStream。該類除了具有一般的write()方法重載之外,新增了專門對Java的基本類型數(shù)據(jù)以及字符串進(jìn)行輸出的方法:
程序結(jié)果:
使用記事本打開a.bat,可以看到下面的結(jié)果:
(2)格式化字節(jié)輸入流:DataInputStream。該類除了具有一般的read()方法重載之外,新增了專門對于Java基本數(shù)據(jù)類型進(jìn)行輸入的方法:
程序結(jié)果:
9.4面向字符輸入/輸出
9.4.1面向字符的文件輸入流面向字符的文件輸入流類為FileReader,其父類為InputStreamReader,InputStreamReader的父類是Reader。FileReader類主要的方法如表9-3所示。
程序結(jié)果:
9.4.2面向字符的文件緩沖輸入流
將一個(gè)磁盤文件生成一個(gè)面向字符的文件輸入流FileReader對象,然后將該對象“包裝”成帶緩沖方式的輸入流BufferedReader對象br,如圖9-5所示。圖9-5“包裝”緩沖輸入對象
程序結(jié)果
9.4.3面向字符的文件輸出流
面向字符的文件輸出流類為FileWriter,其父類為OutputStreamReader,而OutputStreamReader的父類是Writer,其主要的方法如表9-4所示。
程序結(jié)果:
9.4.4面向字符的文件緩沖輸出流
面向字符的文件輸出緩沖流類為BufferedWriter,其父類為java.io.Writer;該類除了具有緩沖輸出方式之外還多了一個(gè)newLine()方法,該方法使用平臺(tái)自己的行分隔符概念進(jìn)行換行;此概念由系統(tǒng)屬性line.separator定義,并非所有平臺(tái)都使用換行符('\n')來終止各行,因此調(diào)用此方法來終止每個(gè)輸出行要優(yōu)于直接寫入換行符。
BufferedWriter類的使用方法,同樣是先產(chǎn)生一個(gè)FileWriter對象fout,然后將該對象“包裝”成為BufferedWriter對象bout,使用bout進(jìn)行面向字符的文件輸出操作就具有了緩沖方式,并且bout可以使用newLine()方法寫出一個(gè)換行到文件中。
程序結(jié)果:
9.5其它輸入/輸出流
9.5.1對象輸入/輸出流將Java程序中的一個(gè)對象寫出到外部文件的操作稱為對象序列化(objectserialize);同樣,也可以從該文件中將對象恢復(fù)到程序中,這就實(shí)現(xiàn)了將程序中的對象保存到磁盤文件中,獨(dú)立于程序存在。一個(gè)類的對象要能被序列化,該類在定義的時(shí)候要實(shí)現(xiàn)java.io.Serializable接口;該接口只是一個(gè)標(biāo)記接口,實(shí)現(xiàn)該接口無需實(shí)現(xiàn)任何方法,它只是表明該類的實(shí)例是可序列化的,滿足對象序列化的語法要求。
通過對象序列化操作,將程序中的某個(gè)對象保存到外部文件中,再將文件傳送到遠(yuǎn)端的程序,然后由遠(yuǎn)端的程序?qū)⑽募械膶ο蠡謴?fù)到程序中,這也是Java分布式計(jì)算/處理的重要技術(shù)之一。
程序結(jié)果:
9.5.2數(shù)組/字符串輸入/輸出流
如果輸入/輸出的數(shù)據(jù)源端、數(shù)據(jù)接收端為字節(jié)數(shù)組、字符數(shù)組或者字符串,如圖9-6所示,可以使用下面的類來完成輸入/輸出操作:
(1)字節(jié)數(shù)組:ByteArrayInputStream、ByteArrayOutputStream。
(2)字符數(shù)組:CharArrayReader、CharArrayWriter。
(3)字符串:StringReader、StringWriter。
圖9-6輸入/輸出端為數(shù)組、字符串情況
前面說過輸入/輸出是相對于程序的,但是如果數(shù)據(jù)源或者接收端是程序中的數(shù)組或者字符串,進(jìn)行數(shù)據(jù)傳輸時(shí)輸入/輸出是相互相對的,例如數(shù)組a要將數(shù)據(jù)傳輸?shù)綌?shù)組b中,可以有下列兩種方式:
(1)相對于數(shù)組b,可以將數(shù)組a作為數(shù)據(jù)源端,生成輸入流對象,將a中的數(shù)據(jù)輸入到b中。
(2)相對于數(shù)組a,可以將數(shù)組b作為數(shù)據(jù)接收端,生成輸出流對象,將a中數(shù)據(jù)輸出到b中。
9.5.3順序輸入流
SequenceInputStream類是面向字節(jié)順序輸入流類,其父類為InputStream,用以將多個(gè)輸入流按順序連接在一起,沒有對應(yīng)的輸出流。當(dāng)將多個(gè)輸入流連接成為單一的輸入流時(shí),就可以按順序進(jìn)行輸入操作,將其中的一個(gè)輸入流數(shù)據(jù)輸入完畢,即可開始下一個(gè)輸入流數(shù)據(jù)的輸入,直到所有的輸入流輸入完畢為止。
SequenceInputStream類的構(gòu)造函數(shù)主要有兩個(gè):
(1)?publicSequenceInputStream(InputStreams1,InputStreams2):將兩個(gè)InputStream輸入流合并為一個(gè)SequenceInputStream輸入流對象。
(2)?publicSequenceInputStream(Enumeration<?extendsInputStream>
e):將多個(gè)InputStream構(gòu)成的枚舉對象合并成為一個(gè)SequenceInputStream輸入流對象。
程序結(jié)果
9.6File類
9.6.1File對象可以將外部存儲(chǔ)器中的文件、文件夾生成File類對象,只需要提供文件或者文件夾的具體路徑和名字即可,如將d盤下javaCode目錄下的FileDemo1.java文件生成File類對象f1、f2,下列這兩種方式都是正確的:
從上面四句程序的字面上看不出File對象里面是文件還是文件夾。從習(xí)慣上來說,文件一般帶后綴名,用以區(qū)分文件類型;文件夾不帶后綴名,用以保存文件或子文件夾。但這只是習(xí)慣,也可以對文件夾起后綴名,而文件沒有后綴名,如圖9-7所示,F(xiàn)ileDemo.java實(shí)際是個(gè)文件夾,javaCode實(shí)際是個(gè)Java源文件。所以上面程序中,對于f1~f4對象而言,只能采用File類相應(yīng)方法才能判斷出它們對應(yīng)的是文件還是文件夾。
圖9-7文件和文件夾名
另外,也可以使用下列方式生成File類對象:
其中,第一個(gè)參數(shù)是盤符-路徑名,第二個(gè)參數(shù)是文件名/文件夾名,表示將指定盤符路徑名下的文件/文件夾生成File類對象。
9.6.2對文件進(jìn)行操作
對一個(gè)文件生成一個(gè)File類對象,就能夠?qū)υ撐募M(jìn)行各種操作,主要是獲取文件的信息、創(chuàng)建、刪除
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年河北唐山幼兒師范高等??茖W(xué)校公開選聘工作人員崗位模擬試卷及1套參考答案詳解
- 涂鴉孔雀課件
- 安全培訓(xùn)行業(yè)市場分析課件
- 涂裝維修知識培訓(xùn)課件
- 安全培訓(xùn)自查記錄課件
- 2025年泉州市部分公辦學(xué)校專項(xiàng)招聘編制內(nèi)新任教師46人(四)模擬試卷含答案詳解
- 2025年泉州安溪城建集團(tuán)有限公司招聘17人考前自測高頻考點(diǎn)模擬試題附答案詳解(突破訓(xùn)練)
- 2025湖南省永州市雙牌縣引進(jìn)急需緊缺人才(教師崗15人)考前自測高頻考點(diǎn)模擬試題及答案詳解(易錯(cuò)題)
- 2025河南豫礦資源開發(fā)集團(tuán)公司招聘12人模擬試卷及完整答案詳解1套
- 2025內(nèi)蒙古通遼市開魯縣衛(wèi)生健康系統(tǒng)招聘衛(wèi)生專業(yè)技術(shù)人員15人模擬試卷參考答案詳解
- 少先隊(duì)建隊(duì)日2025全文課件
- 農(nóng)機(jī)農(nóng)藝融合培訓(xùn)課件
- 張掖輔警考試題目及答案
- 2025年公安部交管局三力測試題庫及答案
- 績效考核模板:物流企業(yè)客戶服務(wù)、倉儲(chǔ)管理、運(yùn)輸配送績效指標(biāo)
- 中石油務(wù)虛會(huì)匯報(bào)
- 施工吊籃專項(xiàng)施工方案
- 家具配件廠產(chǎn)品召回記錄實(shí)施細(xì)則
- 農(nóng)村產(chǎn)業(yè)融合發(fā)展示范園項(xiàng)目可行性研究報(bào)告
- 2025年時(shí)事政治考試題庫及參考答案(100題)
- 護(hù)士輸液PDA掃碼流程課件
評論
0/150
提交評論