使用字元串流读取文字档课件

上传人:des****85 文档编号:321788114 上传时间:2022-07-04 格式:PPT 页数:152 大小:2.39MB
返回 下载 相关 举报
使用字元串流读取文字档课件_第1页
第1页 / 共152页
使用字元串流读取文字档课件_第2页
第2页 / 共152页
使用字元串流读取文字档课件_第3页
第3页 / 共152页
使用字元串流读取文字档课件_第4页
第4页 / 共152页
使用字元串流读取文字档课件_第5页
第5页 / 共152页
点击查看更多>>
资源描述

《使用字元串流读取文字档课件》由会员分享,可在线阅读,更多相关《使用字元串流读取文字档课件(152页珍藏版)》请在金锄头文库上搜索。

1、著作權所有 旗標出版股份有限公司第第 16 章章資料輸入與輸出資料輸入與輸出1本章提要本章提要l16-1 甚麼是串流?l16-2 Java 串流類別架構l16-3 輸出、輸入資料l16-4 物件的讀寫l16-5 綜合演練2前言前言l在本章之前, 我們已多次用 import java.io.* 敘述匯入 Java 的 I/O (資料輸入與輸出) 套件, 並使用其中的 BufferedReader 類別的 readLine() 方法從鍵盤讀取使用者輸入的資料, 以及用 System.out.println() 方法在螢幕上顯示訊息或輸出程式執行的結果。3前言前言l但 java.io 套件的功能可不

2、僅止於此, 舉凡從電腦的螢幕、鍵盤等各種裝置輸出或輸入資料, 或是讀寫電腦中的文字檔、二元檔 (binary file), 甚至是讀寫 ZIP 格式的壓縮檔, 都可透過 java.io 套件中的類別來完成。本章就要來介紹 Java 的資料輸入與輸出架構, 以及如何使用 java.io 套件的各項 I/O 類別。416-1 甚麼是串流?甚麼是串流?l為了簡化程式設計人員處理 I/O 的動作, 不管讀取資料或寫入資料的來源/目的為何 (檔案、網路、或記憶體等等), 都是以串流 (stream) 的方式進行資料的讀取與寫入。而串流就是形容資料像一條河流一樣, 將資料依序從資料來源中流出, 或是流入目

3、的地中。5甚麼是串流?甚麼是串流?6甚麼是串流?甚麼是串流?l在 java.io 套件中, 所有的資料輸出入類別都是以串流的方式來操作資料, 不管讀取或寫入, 都離不開以下三個基本動作:1.開啟串流 (建構串流物件)2.從串流讀取資料、或將資料寫入串流3.關閉串流7甚麼是串流?甚麼是串流?l從程式的觀點, 可供程式讀取的資料來源稱為輸入串流 (input stream);而可用來寫入資料的則稱為輸出串流 (output stream)。不管我們是從磁碟 (檔案)、網路 (URL) 或其它來源或目的建立串流物件, 讀寫的方式都相似, Java 已替我們將其間的不同隱藏起來, 讓我們可以用一致的方

4、式來操作串流, 大幅簡化學習過程。816-2 Java 串流類別架構串流類別架構l在 java.io 套件中, 共有 4 組串流類別, 這 4 組類別可分為兩大類:l以以 byte 為處理單位為處理單位的輸出入串流, 又可稱之為位元串流 (Byte Streams)l以以 char 為處理單位為處理單位的輸出入串流, 又可稱之為字元串流 (Character Streams)9位元串流位元串流l位元串流是以 8 位元的 byte 為單位進行資料的讀寫, 位元串流有兩個最上層的抽像類別:InputStream (輸入) 及 OutputStream (輸出)。所有的輸出入位元串流都是由這兩個類別

5、衍生出來的, 例如我們已用過很多次的 System.out, 它是個 java.io.PrintStream 類別的物件, 此類別是 FilterOutputStream 的子類別, 而 FilterOutputStream 則是 OutputStream 的子類別。10位元串流位元串流l關於位元串流的主要類別, 請參見以下的類別圖:11位元串流位元串流12位元串流位元串流l每種類別都適合於某類的讀取或寫入的動作, 例如 ByteArrayInputStream 適用於讀取位元陣列;FileOutputStream 則適用於寫入檔案。l另外比較特別的是 ObjectIntputStream 和

6、ObjectOutputStream, 這兩個串流類別是特別為了讀寫我們自訂類別的物件而設計, 其詳細用法會在 16-4 節中介紹。13位元串流位元串流l這些串流類別的讀/ 寫方法都有個共通的特性, 就是它們的原型宣告都註明 throws IOException, 所以使用這些方法時, 要記得用 try/catch 來執行, 或是在您的方法宣告也加上 throws IOException 的註記, 將例外拋給上層。14字元串流字元串流l字元串流是以 16 位元的 char 為單位進行資料的讀寫, 字元串流同樣有兩個最上層的抽像類別 Reader、Writer, 分別對應於位元串流的 Input

7、Stream、OutputStream。這類串流類別主要是因應國際化的趨勢, 為方便處理 16 位元的Unicode 字元而設的, 而且字元串流也會自動分辦資料中的 8 位元 ASCII 字元和 Unicode 字元, 不會將兩種資料弄混。15字元串流字元串流l字元串流類別的架構和位元串流有些類似, 而且其中各類別、方法的用法也都和位元串流中對應的類別、方法相似, 所以學會一種用法就等於學會兩種。不過 Reader、Writer 的衍生類別數量較少:16字元串流字元串流17字元串流字元串流1816-3 輸出、輸入資料輸出、輸入資料l標準輸出、輸入l檔案輸出、輸入l讀寫二元檔19標準輸出、輸入標

8、準輸出、輸入l所謂標準輸出一般就是指螢幕, 而標準輸入則是指鍵盤, 在前幾章的程式中, 就是從鍵盤取得使用者輸入的資料, 從螢幕輸出訊息及執行結果。20標準輸出標準輸出 在 System 類別中, 有兩個 PrintStream 類別的成員:lout 成員成員:代表標準輸出標準輸出裝置, 一般而言, 都是指電腦螢幕。不過我們可以利用轉向的方式, 讓輸出的內容是輸出到檔案、印表機、或遠端的終端機等等。例如在命令提示字命令提示字元元視窗中, 可以用 “dir test” 的方式, 使 dir 原本會顯示在螢幕上的資訊轉向存到 test 這個檔案中。(在 Unix/Linux 系統下也可用相同的轉向

9、技巧, 例如 ls test)。21標準輸出標準輸出lerr 成員成員:代表標準示誤訊息輸出裝置, 同樣預設為螢幕。以往當應用程式執行過程中遇到錯誤並需顯示相關訊息通知使用者, 此時就是將訊息輸出到此裝置。雖然 err 與 out 同樣預設為螢幕, 但我們將 out 轉向時, err 並不會跟著轉向。22標準輸出標準輸出l舉例來說, 如果執行 dir ABC test 這個命令, 但資料夾中並無 ABC 這個檔案, 此時 dir 指令仍會將 找不到檔案 的示誤訊息顯示在螢幕上, 而不會存到 test 檔案中。23標準輸出標準輸出lPrintStream 類別多重定義了適用於 Java 各種資料

10、型別的 print()、println() 方法 (後者會在輸出資料後再多輸出一個換行字元以進行換行), 所以我們能用這兩個方法輸出任何資料型別, Java 都會自動以適當的格式輸出。24標準輸出標準輸出l此外, PrintStream 類別還有一對多重定義的 write() 方法, 其功能也是輸出位元資料, 但此時參數是資料的位元值。例如我們要輸出 A 這個字元, 必須指定其 ASCII 碼 65, 例如 write(65);。另一個 write() 方法則是可輸出位元陣列的元素, 且可指定要從第幾個元素開始輸出、共輸出幾個元素:25標準輸出標準輸出lPrintStream 類別有個和其它串

11、流類別不同的特點, 就是它的方法都不會拋出 IOException 例外。以下這個簡單的程式示範了這幾個方法的用法及效果:26標準輸出標準輸出27標準輸出標準輸出28標準輸出標準輸出1.第 812 行的迴圈會分別用 print( ) 和 write( ) 方法輸出 a 陣列中的元素。print( ) 方法會將各元素當整數值輸出, 所以可正常看到輸出值;使用 write( ) 方法時則是將元素值當成一個 2 進元數值輸出, 對螢幕而言, 就是將元素值當成 ASCII 碼, 然後輸出對應的 ASCII 字元。29標準輸出標準輸出l以 a0 為例, ASCII 碼 10 是換行字元, 所以輸出這行後

12、會自動換行; 至於ASCII 碼 20 對應的字元則是一個特殊的控制字元, 所以 a1 這行後面看不到內容;至於最後一個 a4:160 對應的字碼超出 127 (該字元是 a 上面多一撇), 所以在中文環境被當成 Big-5 字碼第一碼, 但因為無第二碼, 因此只輸出一個問號。30標準輸出標準輸出2.第 14 行改用 err 物件以 write() 方法輸出 b 陣列的全部內容。由於 ASCII 碼 7 是個特殊的 BEL 字元, 它只會讓電腦發出嗶聲, 但不會輸出任何字, 而 ASCII 碼 32 對應的是空白字元, 所以這行敘述只會讓電腦發出三聲嗶聲, 但螢幕上看不到任何輸出。31標準輸出

13、標準輸出l若要測試 System.out、System.err 的差異, 可改以轉向的方式來執行這個範例程式, 例如:32標準輸入標準輸入l標準輸入一般指的是鍵盤, 但同樣可以利用轉向的方式從其它裝置來取得。不過細心的讀者或許發現, 前幾章的範例程式並未直接用 System.in 這個物件來讀取鍵盤輸入, 我們都是另外建立一個 BufferedReader 類別的物件, 然後用這個物件來讀取鍵盤輸入。為什麼要這樣做呢?原因很簡單:就是為了方便處理。33標準輸入標準輸入lSystem.in 這個成員是 InputStream 類別的物件, 換言之它是將標準輸入當成位元位元串流來處理, 所以我們若

14、用它來讀取鍵盤輸入, 讀到的都是位元的形式, 處理上並不方便 (想一下如果要讀取中文或 Unicode 字元, 就需進行額外的處理)。此外直接讀取鍵盤輸入串流時, 由於電腦鍵盤緩衝區的運作方式, 會造成一些不易處理的狀況。34標準輸入標準輸入l為讓讀者瞭解直接使用 System.in 的情況, 我們先介紹 InputStream 類別的 read() 方法:35標準輸入標準輸入l使用這些方法時, 都需處理 IOException 例外, 或是單純拋給上層處理。我們就來看一下透過 System.in 物件用這些方法直接讀取鍵盤輸入的情形:36標準輸入標準輸入37標準輸入標準輸入38標準輸入標準輸

15、入39標準輸入標準輸入1.第 9、18 行分別用不同的 read() 方法讀取鍵盤輸入的位元資料。2.第 10 行叫用 Character.toString() 方法 (參見第 17 章) 將字元轉成字串。3.第 13、22 行用 Math.pow() 方法 (參見第 17 章) 計算 2 的 N 次方。40標準輸入標準輸入l讀者可能會覺得很奇怪, 為何會有如上的執行執行結果結果?最主要的原因是範例程式第 1 次呼叫 read() 方法只讀取1個位元, 但使用者可能輸入 2 位數字 (多個位元)、且 InputStream 的 read() 方法也會讀到 Enter 按鍵的資訊所造成的。41標

16、準輸入標準輸入l回頭看第一個執行結果:程式第 1 次要求輸入, 我們輸入 2 時, read() 方法傳回的是 “2” 這個字元的 ASCII 碼, 也就是 50, 所以程式必須進行一些轉換, 才能得到整數以進行運算。l程式第 2 次要求輸入時, 我們還未輸入, 程式就直接顯示例外訊息而結束, 這是因為前一次輸入 2 時按下的 Enter 鍵會產生歸位 (Carriage Return) 及換行 (Line Feed) 字元 (控制碼分別 13 及 10)。42標準輸入標準輸入l所以第 2 次讀取時, read() 方法便直接讀到這些字元, 造成輸入的字串變成空字串, 導致第 19 行程式進行轉換時發生例外。l至於第 2 個執行結果, 則是在第 1 次輸入時, 就故意輸入多個字元。結果第 2 次的 read() 方法就讀到前次未讀到的 5, 所以就直接計算 2 的 5 次方。43標準輸入標準輸入l雖然 Enter 鍵的問題並非不能解決, 但一來這樣做會讓程式多做額外的處理, 二來大多數的應用程式都是要求使用者輸入字元而非位元, 所以我們會用字元串流來包裝用字元串流來包裝 System.

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 教学/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号