Java程序設計基礎 課件 第9章 Java輸入輸出_第1頁
Java程序設計基礎 課件 第9章 Java輸入輸出_第2頁
Java程序設計基礎 課件 第9章 Java輸入輸出_第3頁
Java程序設計基礎 課件 第9章 Java輸入輸出_第4頁
Java程序設計基礎 課件 第9章 Java輸入輸出_第5頁
已閱讀5頁,還剩83頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第九章Java輸入/輸出9.1輸入/輸出的基本概念9.2輸入/輸出類層次結(jié)構9.3面向字節(jié)的輸入/輸出9.4面向字符輸入/輸出9.5其它輸入/輸出流9.6File類本章小結(jié)

9.1輸入/輸出的基本概念

Java是使用“流(Stream)”的概念來進行輸入/輸出的?!傲鳌睂嵸|(zhì)是Java預定義的對不同情況進行輸入/輸出操作的類,“流”對象就是這些類產(chǎn)生的對象,在進行輸入/輸出的時候就是由這些類產(chǎn)生的對象來完成相應操作的。

9.1.1輸入與輸出

Java的輸入/輸出是指相對于程序而言,程序與外部進行的數(shù)據(jù)輸入和輸出的操作。

程序中的輸入與輸出操作很常見,比如從鍵盤上讀取數(shù)據(jù)、從文件讀取數(shù)據(jù)、向文件寫出數(shù)據(jù)等。通過輸入與輸出操作,可以將程序中產(chǎn)生的數(shù)據(jù)輸出到外界,也可以從外界輸入數(shù)據(jù)到程序中,Java語言使用流對象來實現(xiàn)這些輸入/輸出操作,流對象對數(shù)據(jù)的輸入/輸出操作屏蔽了具體的細節(jié),讓Java程序員更為方便地操縱數(shù)據(jù)流向。

首先要明確輸入/輸出的方向:輸入/輸出一定是相對于程序而言的。

(1)相對于程序而言,數(shù)據(jù)是進來的,就稱之為輸入/讀入(input/read)。

(2)相對于程序而言,數(shù)據(jù)是出去的,就稱之為輸出/寫出(output/write)。

如圖9-1所示,避免“讀出”、“寫入”這樣含糊不清的說法。

圖9-1Java相對于程序的輸入/輸出

9.1.2流對象

1.輸入流對象

可以將圖9-1中“程序”左邊的箭頭視為輸入流對象,有能力將數(shù)據(jù)輸入到程序中的對象,就可以視為輸入流對象。輸入流對象對應數(shù)據(jù)源端,數(shù)據(jù)要從外部輸入到程序中,就要說明數(shù)據(jù)源端是什么、在哪里,然后該輸入流對象就采用相應的輸入方法來將數(shù)據(jù)從數(shù)據(jù)源端輸入到程序。

2.輸出流對象

圖9-1中“程序”右邊的箭頭可以視為輸出流對象,有能力將數(shù)據(jù)輸出到程序外部的對象,就可以視為輸出流對象。輸出流對象對應接收端,數(shù)據(jù)要從程序輸出到外部,就要說明接收端是什么、在哪里,然后輸出流對象采用相應的輸出方法將數(shù)據(jù)從程序輸出到接收端。

3.緩沖流對象

以文件的輸入/輸出為例,內(nèi)存中的程序要和磁盤中的文件進行數(shù)據(jù)輸入/輸出,然而二者速度不匹配,磁盤文件的操作比內(nèi)存的操作慢很多。顯然,在這樣的情況下每次輸入/輸出一個字節(jié)的效率是非常低的。為了提高數(shù)據(jù)的傳輸效率,通常使用緩沖流(BufferedStream)來提高數(shù)據(jù)的輸入/輸出效率。

4.字節(jié)流/字符流

進行數(shù)據(jù)的輸入/輸出時,需要確定數(shù)據(jù)輸入/輸出的基本單位是什么。

(1)字節(jié)流:即每次輸入/輸出是按字節(jié)進行(1B?=?8bit)的。這種方式是最基本的輸入/輸出方式,能夠?qū)λ袛?shù)據(jù)進行輸入/輸出(計算機中的所有數(shù)據(jù)是以0和1來存儲的)。字節(jié)流又被稱為二進制字節(jié)流(binarybytestream)或位流(bitsstream)。

(2)字符流:字符流的基本單位是字符char,是針對字符優(yōu)化了的輸入/輸出。Java的char是采用2個字節(jié)的Unicode編碼,所以字符流一次輸入/輸出2個字節(jié),針對字符類型數(shù)據(jù)進行輸入/輸出較為方便且效率高。

9.2輸入/輸出類層次結(jié)構

為了便于程序員進行輸入/輸出操作,屏蔽輸入/輸出的細節(jié),Java將相關輸入/輸出操作封裝在相應的類中,這些類放置在java.io包里,如圖9-2所示。

圖9-2Java輸入/輸出類層次圖

在java.io包中有4個基本類,即InputStream、OutputStream及Reader、Writer類,它們分別處理字節(jié)流和字符流,根據(jù)數(shù)據(jù)源端和接收端的不同以及輸入/輸出方式的不同,它們下面還有若干子類。除了這4個基本類,另外還有File類以及隨機訪問文件類RandomAccessFile等。

9.3面向字節(jié)的輸入/輸出

InputStream和OutputStream類是Java中用來處理以字節(jié)(Byte)為單位的輸入/輸出流的,這兩個類下面還有更為具體的面向字節(jié)的輸入/輸出類,用以處理各種不同的輸入/輸出。還是以文件為例,它們可以處理二進制文件(binaryfile)、文本文件、圖片聲音文件等等,所有文件在外部存儲器上都是以位和字節(jié)的方式存儲數(shù)據(jù)的,所以都可以使用面向字節(jié)的輸入/輸出流對各種文件進行輸入/輸出(對于文本文件,使用下一節(jié)將介紹的面向字符的輸入/輸出流進行操作更為方便)。

我們以文件的輸入/輸出為例進行介紹,這也是最常見的輸入/輸出方式。對于文件,按字節(jié)的方式進行輸入/輸出,主要將使用下面兩個類:

(1)?FileInputStream:面向字節(jié)的文件輸入流。

(2)?FileOutputStream:面向字節(jié)的文件輸出流。

9.3.1面向字節(jié)的文件輸入流

FileInputStream的主要方法如表9-1所示。

read()方法有以下三個重載形式:

(1)將數(shù)據(jù)源端的1個字節(jié)輸入到程序中。

(2)將數(shù)據(jù)源端的多個字節(jié)輸入到程序中(與數(shù)據(jù)源端字節(jié)多少、程序接收字節(jié)的byte數(shù)組大小有關,一般情況下程序員控制二者相等)。

(3)將數(shù)據(jù)源端中指定的字節(jié)輸入到程序中(指定偏移量和字節(jié)數(shù))。

如何構造FileInputStream類的對象呢?主要有兩種方式:

(1)通過String形式的文件路徑-文件名來構造FileInputStream類對象。

(2)通過一個File類對象來構造FileInputStream類對象(File類后面將詳細討論)。

程序結(jié)果:

9.3.2面向字節(jié)的文件輸出流

FileOutputStream的主要方法如表9-2所示。

從表9-2可以看出,F(xiàn)ileOutputStream的主要方法是write(),與FileInputStream類似,也是具有三個重載方法:

(1)將單個的字節(jié)寫出到輸出流對應的接收端:

write(int

b)

(2)將byte數(shù)組的所有字節(jié)一次性輸出到接收端:

write(byte[]

b)

(3)將byte數(shù)組的指定字節(jié)輸出到接收端:

write(byte[]

b,int

off,int

len)

下面在上述程序的基礎上進行下列操作:將d盤javaCode目錄下的a.jpg文件輸入到程序的b數(shù)組中,然后將b數(shù)組中的字節(jié)元素依次輸出到同目錄下的b.jpg文件中,這相當于對文件的復制操作。

9.3.3帶緩沖的字節(jié)輸入/輸出流

對數(shù)據(jù)流的每次操作若都是以字節(jié)為單位進行的,每次輸入/輸出一個字節(jié),效率將是非常低的。那么,如何提高輸入/輸出的效率?一個有效的解決方法就是以帶緩沖的方式來進行輸入/輸出,將使用下面兩個類來完成:

(1)字節(jié)緩沖輸入流:BufferedInputStream。

(2)字節(jié)緩沖輸出流:BufferedOutputStream。

具體是先產(chǎn)生一個面向字節(jié)的文件輸入/輸出流對象,然后將該對象作為緩沖流構造函數(shù)的參數(shù),從而“包裝”成一個緩沖流對象,使用該緩沖流對象進行read和write操作就具有緩沖的方式,如圖9-3所示。

圖9-3“包裝”緩沖輸入/輸出對象

對文件按字節(jié)進行輸入/輸出有以下幾種方式:

(1)采用循環(huán)一個一個字節(jié)地輸入/輸出。

(2)對(1)加緩沖輸入/輸出方式。

(3)使用byte數(shù)組作為參數(shù),一次性輸入/輸出多個字節(jié)。

(4)對(3)加緩沖輸入/輸出方式。

程序結(jié)果:

程序結(jié)果:

程序結(jié)果

程序結(jié)果:

9.3.4格式化輸入/輸出流

進行輸入/輸出的主要是兩種單位,即字節(jié)、字符,但有時會希望一次輸入/輸出一個int整數(shù)數(shù)據(jù)(4字節(jié)),或者一個double數(shù)據(jù)(8字節(jié))等基本類型數(shù)據(jù),這種情況就可以使用下面兩個類來完成:

(1)格式化字節(jié)輸入流:DataInputStream。

(2)格式化字節(jié)輸出流:DataOutputStream。

如圖9-4所示,還是使用“包裝”的方式。圖9-4“包裝”格式化輸入/輸出對象

如圖9-4所示,先產(chǎn)生基本的輸入/輸出對象fin和fout,然后進行“包裝”,產(chǎn)生格式化輸入/輸出流對象din和dout;使用din和dout對象就具有新的輸入/輸出方法,能夠按照各種基本數(shù)據(jù)類型進行輸入/輸出,這就是格式化輸入/輸出。

下面先使用格式化字節(jié)輸出流輸出幾個基本數(shù)據(jù)到a.bat文件中,然后使用格式化字節(jié)輸入流來讀取這些基本數(shù)據(jù)。

(1)格式化字節(jié)輸出流:DataOutputStream。該類除了具有一般的write()方法重載之外,新增了專門對Java的基本類型數(shù)據(jù)以及字符串進行輸出的方法:

程序結(jié)果:

使用記事本打開a.bat,可以看到下面的結(jié)果:

(2)格式化字節(jié)輸入流:DataInputStream。該類除了具有一般的read()方法重載之外,新增了專門對于Java基本數(shù)據(jù)類型進行輸入的方法:

程序結(jié)果:

9.4面向字符輸入/輸出

9.4.1面向字符的文件輸入流面向字符的文件輸入流類為FileReader,其父類為InputStreamReader,InputStreamReader的父類是Reader。FileReader類主要的方法如表9-3所示。

程序結(jié)果:

9.4.2面向字符的文件緩沖輸入流

將一個磁盤文件生成一個面向字符的文件輸入流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;該類除了具有緩沖輸出方式之外還多了一個newLine()方法,該方法使用平臺自己的行分隔符概念進行換行;此概念由系統(tǒng)屬性line.separator定義,并非所有平臺都使用換行符('\n')來終止各行,因此調(diào)用此方法來終止每個輸出行要優(yōu)于直接寫入換行符。

BufferedWriter類的使用方法,同樣是先產(chǎn)生一個FileWriter對象fout,然后將該對象“包裝”成為BufferedWriter對象bout,使用bout進行面向字符的文件輸出操作就具有了緩沖方式,并且bout可以使用newLine()方法寫出一個換行到文件中。

程序結(jié)果:

9.5其它輸入/輸出流

9.5.1對象輸入/輸出流將Java程序中的一個對象寫出到外部文件的操作稱為對象序列化(objectserialize);同樣,也可以從該文件中將對象恢復到程序中,這就實現(xiàn)了將程序中的對象保存到磁盤文件中,獨立于程序存在。一個類的對象要能被序列化,該類在定義的時候要實現(xiàn)java.io.Serializable接口;該接口只是一個標記接口,實現(xiàn)該接口無需實現(xiàn)任何方法,它只是表明該類的實例是可序列化的,滿足對象序列化的語法要求。

通過對象序列化操作,將程序中的某個對象保存到外部文件中,再將文件傳送到遠端的程序,然后由遠端的程序?qū)⑽募械膶ο蠡謴偷匠绦蛑?,這也是Java分布式計算/處理的重要技術之一。

程序結(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ù)組或者字符串,進行數(shù)據(jù)傳輸時輸入/輸出是相互相對的,例如數(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,用以將多個輸入流按順序連接在一起,沒有對應的輸出流。當將多個輸入流連接成為單一的輸入流時,就可以按順序進行輸入操作,將其中的一個輸入流數(shù)據(jù)輸入完畢,即可開始下一個輸入流數(shù)據(jù)的輸入,直到所有的輸入流輸入完畢為止。

SequenceInputStream類的構造函數(shù)主要有兩個:

(1)?publicSequenceInputStream(InputStreams1,InputStreams2):將兩個InputStream輸入流合并為一個SequenceInputStream輸入流對象。

(2)?publicSequenceInputStream(Enumeration<?extendsInputStream>

e):將多個InputStream構成的枚舉對象合并成為一個SequenceInputStream輸入流對象。

程序結(jié)果

9.6File類

9.6.1File對象可以將外部存儲器中的文件、文件夾生成File類對象,只需要提供文件或者文件夾的具體路徑和名字即可,如將d盤下javaCode目錄下的FileDemo1.java文件生成File類對象f1、f2,下列這兩種方式都是正確的:

從上面四句程序的字面上看不出File對象里面是文件還是文件夾。從習慣上來說,文件一般帶后綴名,用以區(qū)分文件類型;文件夾不帶后綴名,用以保存文件或子文件夾。但這只是習慣,也可以對文件夾起后綴名,而文件沒有后綴名,如圖9-7所示,F(xiàn)ileDemo.java實際是個文件夾,javaCode實際是個Java源文件。所以上面程序中,對于f1~f4對象而言,只能采用File類相應方法才能判斷出它們對應的是文件還是文件夾。

圖9-7文件和文件夾名

另外,也可以使用下列方式生成File類對象:

其中,第一個參數(shù)是盤符-路徑名,第二個參數(shù)是文件名/文件夾名,表示將指定盤符路徑名下的文件/文件夾生成File類對象。

9.6.2對文件進行操作

對一個文件生成一個File類對象,就能夠?qū)υ撐募M行各種操作,主要是獲取文件的信息、創(chuàng)建、刪除

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論