使用字元串流读取文字档课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《使用字元串流读取文字档课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 使用 字元 串流 读取 文字 课件
- 资源描述:
-
1、著作權所有 旗標出版股份有限公司1第第 16 章章資料輸入與輸出資料輸入與輸出2本章提要本章提要l16-1 甚麼是串流?l16-2 Java 串流類別架構l16-3 輸出、輸入資料l16-4 物件的讀寫l16-5 綜合演練3前言前言l在本章之前,我們已多次用 import java.io.*敘述匯入 Java 的 I/O(資料輸入與輸出)套件,並使用其中的 BufferedReader 類別的 readLine()方法從鍵盤讀取使用者輸入的資料,以及用 System.out.println()方法在螢幕上顯示訊息或輸出程式執行的結果。4前言前言l但 java.io 套件的功能可不僅止於此,舉凡
2、從電腦的螢幕、鍵盤等各種裝置輸出或輸入資料,或是讀寫電腦中的文字檔、二元檔(binary file),甚至是讀寫 ZIP 格式的壓縮檔,都可透過 java.io 套件中的類別來完成。本章就要來介紹 Java 的資料輸入與輸出架構,以及如何使用 java.io 套件的各項 I/O 類別。516-1 甚麼是串流?甚麼是串流?l為了簡化程式設計人員處理 I/O 的動作,不管讀取資料或寫入資料的來源/目的為何(檔案、網路、或記憶體等等),都是以串流(stream)的方式進行資料的讀取與寫入。而串流就是形容資料像一條河流一樣,將資料依序從資料來源中流出,或是流入目的地中。6甚麼是串流?甚麼是串流?7甚麼
3、是串流?甚麼是串流?l在 java.io 套件中,所有的資料輸出入類別都是以串流的方式來操作資料,不管讀取或寫入,都離不開以下三個基本動作:1.開啟串流(建構串流物件)2.從串流讀取資料、或將資料寫入串流3.關閉串流8甚麼是串流?甚麼是串流?l從程式的觀點,可供程式讀取的資料來源稱為輸入串流(input stream);而可用來寫入資料的則稱為輸出串流(output stream)。不管我們是從磁碟(檔案)、網路(URL)或其它來源或目的建立串流物件,讀寫的方式都相似,Java 已替我們將其間的不同隱藏起來,讓我們可以用一致的方式來操作串流,大幅簡化學習過程。916-2 Java 串流類別架構
4、串流類別架構l在 java.io 套件中,共有 4 組串流類別,這 4 組類別可分為兩大類:l以以 byte 為處理單位為處理單位的輸出入串流,又可稱之為位元串流(Byte Streams)l以以 char 為處理單位為處理單位的輸出入串流,又可稱之為字元串流(Character Streams)10位元串流位元串流l位元串流是以 8 位元的 byte 為單位進行資料的讀寫,位元串流有兩個最上層的抽像類別:InputStream(輸入)及 OutputStream(輸出)。所有的輸出入位元串流都是由這兩個類別衍生出來的,例如我們已用過很多次的 System.out,它是個 java.io.Pr
5、intStream 類別的物件,此類別是 FilterOutputStream 的子類別,而 FilterOutputStream 則是 OutputStream 的子類別。11位元串流位元串流l關於位元串流的主要類別,請參見以下的類別圖:12位元串流位元串流13位元串流位元串流l每種類別都適合於某類的讀取或寫入的動作,例如 ByteArrayInputStream 適用於讀取位元陣列;FileOutputStream 則適用於寫入檔案。l另外比較特別的是 ObjectIntputStream 和ObjectOutputStream,這兩個串流類別是特別為了讀寫我們自訂類別的物件而設計,其詳細
6、用法會在 16-4 節中介紹。14位元串流位元串流l這些串流類別的讀/寫方法都有個共通的特性,就是它們的原型宣告都註明 throws IOException,所以使用這些方法時,要記得用 try/catch 來執行,或是在您的方法宣告也加上 throws IOException 的註記,將例外拋給上層。15字元串流字元串流l字元串流是以 16 位元的 char 為單位進行資料的讀寫,字元串流同樣有兩個最上層的抽像類別 Reader、Writer,分別對應於位元串流的 InputStream、OutputStream。這類串流類別主要是因應國際化的趨勢,為方便處理 16 位元的Unicode 字
7、元而設的,而且字元串流也會自動分辦資料中的 8 位元 ASCII 字元和 Unicode 字元,不會將兩種資料弄混。16字元串流字元串流l字元串流類別的架構和位元串流有些類似,而且其中各類別、方法的用法也都和位元串流中對應的類別、方法相似,所以學會一種用法就等於學會兩種。不過 Reader、Writer 的衍生類別數量較少:17字元串流字元串流18字元串流字元串流1916-3 輸出、輸入資料輸出、輸入資料l標準輸出、輸入l檔案輸出、輸入l讀寫二元檔20標準輸出、輸入標準輸出、輸入l所謂標準輸出一般就是指螢幕,而標準輸入則是指鍵盤,在前幾章的程式中,就是從鍵盤取得使用者輸入的資料,從螢幕輸出訊息
8、及執行結果。21標準輸出標準輸出 在 System 類別中,有兩個 PrintStream 類別的成員:lout 成員成員:代表標準輸出標準輸出裝置,一般而言,都是指電腦螢幕。不過我們可以利用轉向的方式,讓輸出的內容是輸出到檔案、印表機、或遠端的終端機等等。例如在命令提示字命令提示字元元視窗中,可以用“dir test”的方式,使 dir 原本會顯示在螢幕上的資訊轉向存到 test 這個檔案中。(在 Unix/Linux 系統下也可用相同的轉向技巧,例如 ls test)。22標準輸出標準輸出lerr 成員成員:代表標準示誤訊息輸出裝置,同樣預設為螢幕。以往當應用程式執行過程中遇到錯誤並需顯示
9、相關訊息通知使用者,此時就是將訊息輸出到此裝置。雖然 err 與 out 同樣預設為螢幕,但我們將 out 轉向時,err 並不會跟著轉向。23標準輸出標準輸出l舉例來說,如果執行 dir ABC test 這個命令,但資料夾中並無 ABC 這個檔案,此時 dir 指令仍會將 找不到檔案 的示誤訊息顯示在螢幕上,而不會存到 test 檔案中。24標準輸出標準輸出lPrintStream 類別多重定義了適用於 Java 各種資料型別的 print()、println()方法(後者會在輸出資料後再多輸出一個換行字元以進行換行),所以我們能用這兩個方法輸出任何資料型別,Java 都會自動以適當的格式
10、輸出。25標準輸出標準輸出l此外,PrintStream 類別還有一對多重定義的 write()方法,其功能也是輸出位元資料,但此時參數是資料的位元值。例如我們要輸出 A 這個字元,必須指定其 ASCII 碼 65,例如 write(65);。另一個 write()方法則是可輸出位元陣列的元素,且可指定要從第幾個元素開始輸出、共輸出幾個元素:26標準輸出標準輸出lPrintStream 類別有個和其它串流類別不同的特點,就是它的方法都不會拋出 IOException 例外。以下這個簡單的程式示範了這幾個方法的用法及效果:27標準輸出標準輸出28標準輸出標準輸出29標準輸出標準輸出1.第 812
11、 行的迴圈會分別用 print()和 write()方法輸出 a 陣列中的元素。print()方法會將各元素當整數值輸出,所以可正常看到輸出值;使用 write()方法時則是將元素值當成一個 2 進元數值輸出,對螢幕而言,就是將元素值當成 ASCII 碼,然後輸出對應的 ASCII 字元。30標準輸出標準輸出l以 a0 為例,ASCII 碼 10 是換行字元,所以輸出這行後會自動換行;至於ASCII 碼 20 對應的字元則是一個特殊的控制字元,所以 a1 這行後面看不到內容;至於最後一個 a4:160 對應的字碼超出 127(該字元是 a 上面多一撇),所以在中文環境被當成 Big-5 字碼第
12、一碼,但因為無第二碼,因此只輸出一個問號。31標準輸出標準輸出2.第 14 行改用 err 物件以 write()方法輸出 b 陣列的全部內容。由於 ASCII 碼 7 是個特殊的 BEL 字元,它只會讓電腦發出嗶聲,但不會輸出任何字,而 ASCII 碼 32 對應的是空白字元,所以這行敘述只會讓電腦發出三聲嗶聲,但螢幕上看不到任何輸出。32標準輸出標準輸出l若要測試 System.out、System.err 的差異,可改以轉向的方式來執行這個範例程式,例如:33標準輸入標準輸入l標準輸入一般指的是鍵盤,但同樣可以利用轉向的方式從其它裝置來取得。不過細心的讀者或許發現,前幾章的範例程式並未直
13、接用 System.in 這個物件來讀取鍵盤輸入,我們都是另外建立一個 BufferedReader 類別的物件,然後用這個物件來讀取鍵盤輸入。為什麼要這樣做呢?原因很簡單:就是為了方便處理。34標準輸入標準輸入lSystem.in 這個成員是 InputStream 類別的物件,換言之它是將標準輸入當成位元位元串流來處理,所以我們若用它來讀取鍵盤輸入,讀到的都是位元的形式,處理上並不方便(想一下如果要讀取中文或 Unicode 字元,就需進行額外的處理)。此外直接讀取鍵盤輸入串流時,由於電腦鍵盤緩衝區的運作方式,會造成一些不易處理的狀況。35標準輸入標準輸入l為讓讀者瞭解直接使用 Syste
14、m.in 的情況,我們先介紹 InputStream 類別的 read()方法:36標準輸入標準輸入l使用這些方法時,都需處理 IOException 例外,或是單純拋給上層處理。我們就來看一下透過 System.in 物件用這些方法直接讀取鍵盤輸入的情形:37標準輸入標準輸入38標準輸入標準輸入39標準輸入標準輸入40標準輸入標準輸入1.第 9、18 行分別用不同的 read()方法讀取鍵盤輸入的位元資料。2.第 10 行叫用 Character.toString()方法(參見第 17 章)將字元轉成字串。3.第 13、22 行用 Math.pow()方法(參見第 17 章)計算 2 的 N
15、 次方。41標準輸入標準輸入l讀者可能會覺得很奇怪,為何會有如上的執行執行結果結果?最主要的原因是範例程式第 1 次呼叫 read()方法只讀取1個位元,但使用者可能輸入 2 位數字(多個位元)、且 InputStream 的 read()方法也會讀到 Enter 按鍵的資訊所造成的。42標準輸入標準輸入l回頭看第一個執行結果:程式第 1 次要求輸入,我們輸入 2 時,read()方法傳回的是“2”這個字元的 ASCII 碼,也就是 50,所以程式必須進行一些轉換,才能得到整數以進行運算。l程式第 2 次要求輸入時,我們還未輸入,程式就直接顯示例外訊息而結束,這是因為前一次輸入 2 時按下的
16、Enter 鍵會產生歸位(Carriage Return)及換行(Line Feed)字元(控制碼分別 13 及 10)。43標準輸入標準輸入l所以第 2 次讀取時,read()方法便直接讀到這些字元,造成輸入的字串變成空字串,導致第 19 行程式進行轉換時發生例外。l至於第 2 個執行結果,則是在第 1 次輸入時,就故意輸入多個字元。結果第 2 次的 read()方法就讀到前次未讀到的 5,所以就直接計算 2 的 5 次方。44標準輸入標準輸入l雖然 Enter 鍵的問題並非不能解決,但一來這樣做會讓程式多做額外的處理,二來大多數的應用程式都是要求使用者輸入字元而非位元,所以我們會用字元串流
17、來包裝用字元串流來包裝 System.in,達到簡化處理的目的。45用字元串流來包裝用字元串流來包裝 System.inl為了方便我們從鍵盤取得資料,我們會以字元串流來包裝 System.in 這個位元串流,包裝(wrap)意指用 System.in 來建立字元串流字元串流的物件,所以對程式來說,它使用的是 字元 串流,而非原始的 System.in 位元 串流。46用字元串流來包裝用字元串流來包裝 System.inl以前幾章取得鍵盤輸入的方式為例,我們都使用如下的程式:47用字元串流來包裝用字元串流來包裝 System.inl上述程式就是先將 System.in 物件先包裝成 InputS
18、treamReader 物件,然後再包一層變成 BufferedReader 物件,最後才用此物件的 readLine()方法來取得輸入。之所以要包兩層,主要原因可分為 2 點:48用字元串流來包裝用字元串流來包裝 System.inlInputStreamReader 是個特殊的字元串流,它的功用就是從位元串流取得輸入,然後將這些位元解讀成字元。因此在建構 InputStreamReader 物件時,必須以一個位元串流物件為參數來呼叫其建構方法。但 InputStreamReader 在使用上仍有前述 Enter 鍵的問題,操作並不方便。因此一般都會將它再包裝成其它更方便使用的串流類別物件,
19、例如 BufferedReader。49用字元串流來包裝用字元串流來包裝 System.inlBufferedReader 是所謂的緩衝式輸入串流,也就是先將串流的輸入存到一記憶體緩衝區中,程式再到這個緩衝區讀取輸入。在讀取檔案時這種緩衝式輸入效率較佳,而讀取鍵盤輸入時,也可免去處理 Enter 鍵的問題。50用字元串流來包裝用字元串流來包裝 System.inl但 BufferedReader 只有以 Reader 物件為參數的建構方法,因此我們必須先將 System.in 轉成 InputStreamReader 物件,才能用後者呼叫 BufferedReader 的建構方法,產生所要的物
20、件。l使用 BufferedReader 的 readLine()方法讀取輸入時,每次會讀取 一行的內容,且會自動忽略該行結尾的歸位及換行字元,因此可順利解決 Enter 鍵的問題。請參考以下範例:51用字元串流來包裝用字元串流來包裝 System.in52用字元串流來包裝用字元串流來包裝 System.in53用字元串流來包裝用字元串流來包裝 System.in54用字元串流來包裝用字元串流來包裝 System.in1.第 09 行用 InputStreamReader 包裝 System.in。2.第 14 行以 while 迴圈的方式連續讀取多個字元,遇到換行字元(字碼為 10)時即停止
21、。3.第 18、19 行改以 for 迴圈輸出所有讀到的字元。4.第 24 行使用 BufferedReader 包裝第 09 行建立的 InputStreamReader 物件。55用字元串流來包裝用字元串流來包裝 System.inl此外 BufferedReader 仍是有兩個 read()方法可用於特定的字元讀取方式:56檔案輸出、輸入檔案輸出、輸入l在前一節我們透過 System.in 及 System.out 認識一些位元串流及字元串流的基本用法。其實只要稍加變化,我們就能用串流來讀寫檔案了。l如前所述,要進行檔案讀寫,首先要做的就是開啟檔案串流,接著即可用串流的方法進行讀寫,讀寫
22、完畢後則需關閉串流以節省系統資源。57使用字元串流讀取文字檔使用字元串流讀取文字檔l要讀寫檔案,可使用內建的 FileReader/FileWriter 字元串流來處理,如其名稱所示,它們是專為檔案所設計的。l這兩個字元串流的用法都很簡單,分別以檔案名稱為參數呼叫其建構方法即可建立該檔案的串流物件,以下我們先來看 FileReader 的用法。58使用字元串流讀取文字檔使用字元串流讀取文字檔lFileReader 是 InputStreamReader 的子類別,所以可用前一節介紹的 read()方法來讀取串流中的字元。以下就是用 FileReader 讀取文字檔中所有字元並輸出在螢幕上的小程
23、式。59使用字元串流讀取文字檔使用字元串流讀取文字檔60使用字元串流讀取文字檔使用字元串流讀取文字檔61使用字元串流讀取文字檔使用字元串流讀取文字檔62使用字元串流讀取文字檔使用字元串流讀取文字檔1.第 13 行取得使用者輸入的檔名(路徑)字串,第 14 行即以此字串建立 FileReader 物件 fr。2.第 18、19 行以 while 迴圈的方式連續用 fr.read()讀取檔案中的字元,讀到檔案結尾時,read()會傳回-1,即停止迴圈。3.第 21 行呼叫 close()關閉檔案串流。63使用字元串流讀取文字檔使用字元串流讀取文字檔l至於寫入檔案用的 FileWriter 類別則是
24、 OutputStreamWriter 的子類別。請注意,如果在建立寫入串流時,指定了已存在的檔案,則程式會將檔案中原有的資料全部清除,再寫入新的資料。lFileReader 類別並無定義自己的寫入方法,其寫入功能只有繼承自 OutputStreamWriter 的三個 write()方法:64使用字元串流讀取文字檔使用字元串流讀取文字檔65使用字元串流讀取文字檔使用字元串流讀取文字檔l相信這 3 個 write()的用法應不必特別說明了,我們直接來看範例程式的使用情形。以下這個範例程式請使用者輸入新的檔案名稱,並建立 FileReader 寫入串流,接著請使用者輸入字串、整數、浮點數等三種資
25、料,並寫入檔案串流中,最後並輸出檔案內容以比對檢視:66使用字元串流讀取文字檔使用字元串流讀取文字檔67使用字元串流讀取文字檔使用字元串流讀取文字檔68使用字元串流讀取文字檔使用字元串流讀取文字檔69使用字元串流讀取文字檔使用字元串流讀取文字檔70使用字元串流讀取文字檔使用字元串流讀取文字檔1.第 14 行用使用者輸入的檔名路徑建立新的串流物件。雖然訊息提示的是請使用者輸入新檔案,但其實也可輸入現有的檔名,但此舉將會使檔案原有的內容被範例程式寫入的內容覆蓋掉,因此建議不要用既有檔案做測試。2.第 18、23、28 行分別將使用者輸入的資料以字串的格式用 write()方法寫入。71使用字元串流
展开阅读全文