• 沒有找到結果。

輸入輸出

N/A
N/A
Protected

Academic year: 2021

Share "輸入輸出"

Copied!
48
0
0

加載中.... (立即查看全文)

全文

(1)
(2)

輸入輸出

學習目標

• 瞭解串流與輸入輸出的關係

• 認識 InputStream 、 OutputStream 繼承架構

• 認識 Reader 、 Writer 繼承架構

• 使用輸入輸出裝飾器類別

(3)

串流設計觀念

(4)

串流設計觀念

• 從應用程式角度來看,如果要將資料從來源 取出,可以使用輸入串流,如果要將資料寫 入目的地,可以使用輸出串流

• 輸入串流代表物件為

java.io.InputStream 實例,輸出串流

代表物件為 java.io.OutputStream 實例

(5)

串流設計觀念

(6)

串流設計觀念

• 來源與目的地都不知道的情況下,如何撰寫 程式?

(7)

串流設計觀念

• 在不使用 InputStream 與

OutputStream 時,必須使用 close() 方 法關閉串流

• InputStream 與 OutputStream 實作了 java.io.Closeable 介面,其父介面為 java.lang.AutoCloseable 介面,因此 可使用 JDK7 嘗試自動關閉資源語法

(8)

串流設計觀念

• 如果要將某個檔案讀入並另存為另一個檔 案 ..

(9)

串流設計觀念

• 如果要從 HTTP 伺服器讀取某個網頁,並另 存為檔案

(10)

串流設計觀念

• 使用 java.net.ServerSocket 接受客戶 端連線的例子:

(11)

串流設計觀念

• 將來學到 Servlet ,想將檔案輸出至瀏覽器,

也會有類似的操作:

(12)

串流繼承架構

(13)

串流繼承架構

(14)

串流繼承架構

• 記得 System.in 與 System.out 嗎?分別 是 InputStream 與 PrintStream 的實例

• 較少直接操作 InputStream 相關方法,而 是如先前章節使用 java.util.Scanner 包裹 System.in

(15)

串流繼承架構

• 可以使用 System 的 setIn() 方法指定 InputStream 實例,指定標準輸入來源

• 將標準輸入指定為 FileInputStream ,可 以讀取指定檔案並顯示在文字模式

(16)

串流繼承架構

• 若要將 10.1.1 的 Download 範例改為輸出至 標準輸出,也可以這麼寫:

(17)

串流繼承架構

• 標準輸出可以重新導向至檔案,只要執行程 式時使用 > 將輸出結果導向至指定的檔案

• 如果使用 >> 則是附加訊息

(18)

串流繼承架構

• 可以使用 System 的 setOut() 方法指定 PrintStream 實例,將結果輸出至指定的 目的地

• 將標準輸出指定至檔案:

(19)

串流繼承架構

• System.err 為 PrintSteam 實例,稱之為 標準錯誤輸出串流,用來立即顯示錯誤訊息

• System.out 輸出的訊息可以使用 > 或 >> 重 新導向至檔案,但 System.err 輸出的訊息 一定會顯示在文字模式中,無法重新導向

• 可以使用 System.setErr() 指定

PrintStream ,指定標準錯誤輸出串流

(20)

串流繼承架構

• FileInputStream 是 InputStream 的子類,可 以指定檔案名稱建構實例,一旦建構檔案就開啟,

接著就可用來讀取資料

• FileOutputStream 是 OutputStream 的子類

,可以指定檔案名稱建構實例,一旦建構檔案就開 啟,接著就可以用來寫出資料

• 無論是 FileInputStream 或

FileOutputStream ,不使用時都要使用 close() 關閉檔案

(21)

串流繼承架構

• FileInputStream 主要實作了

InputStream 的 read() 抽象方法,使之 可從檔案中讀取資料

• FileOutputStream 主要實作了

OutputStream 的 write() 抽象方法,使 之可寫出資料至檔案

(22)

串流繼承架構

• FileInputStream 、 FileOutputStrea m 在讀取、寫入檔案時,是以位元組為單位

• 通常會使用一些高階類別加以包裹,進行一 些高階操作,像是 Scanner 與

PrintStream 類別等

(23)

串流繼承架構

• ByteArrayInputStream 是

InputStream 的子類,可以指定 byte 陣 列建構實例,一旦建構就可將 byte 陣列當 作資料來源進行讀取

• ByteArrayOutputStream 是

OutputStream 的子類,可以指定 byte 陣 列建構實例,一旦建構將 byte 陣列寫作目 的地寫出資料

(24)

串流繼承架構

• ByteArrayInputStream 主要實作了

InputStream 的 read() 抽象方法,使之 可從 byte 陣列中讀取資料

• ByteArrayOutputStream 主要實作了

OutputStream 的 write() 抽象方法,使 之可寫出資料至 byte 陣列

(25)

串流處理裝飾器

• InputStream 、 OutputStream 提供串流 基本操作,如果想要為輸入輸出的資料作加 工處理,則可以使用包裹器類別

– 具備緩衝區作用的 BufferedInputStream 、 BufferedOutputStream

– 具備資料轉換處理作用的 DataInputStream

、 DataOutputStream

– 具備物件序列化能力的 ObjectInputStream

、 ObjectOutputStream

(26)

串流處理裝飾器

(27)

串流處理裝飾器

• 如果傳入 IO.dump() 的是

FileInputStream 、 FileOutputStrea m 實例,每次 read() 時都會要求讀取硬碟

,每次 write() 都會要求寫入硬碟,這會 花費許多時間在硬碟定位上

(28)

串流處理裝飾器

• BufferedInputStream 與

BufferedOutputStream 主要於內部提供 緩衝區功能

• 建構

BufferedInputStream 、 BufferedOut putStream 必須提供

InputStream 、 OutputStream 進行包裹

,可以使用預設或自訂緩衝區大小

(29)

串流處理裝飾器

(30)

串流處理裝飾器

• DataInputStream 、 DataOutputStrea m 提供讀取、寫入 Java 基本資料型的方法

,像是讀寫 int 、 double 、 boolean 等 的方法

(31)
(32)
(33)

串流處理裝飾器

• ObjectInputStream 提供 readObject() 方法 將資料讀入為物件,而 ObjectOutputStream 提 供 writeObject() 方法將物件寫至目的地

• 可以被這兩個方法處理的物件,必須實作

java.io.Serializable 介面,這個介面並沒有 定義任何方法,只是作為標示之用,表示這個物件 是可以序列化的( Serializable )

(34)
(35)
(36)

串流處理裝飾器

• 如果在作物件序列化時,物件中某些資料成 員不希望被寫入,則可以標上 transient 關鍵字

(37)

Reader 與 Writer 繼承架構

(38)

Reader 與 Writer 繼承架構

• 在不使用 Reader 與 Writer 時,必須使用 close() 方法關閉串流,由於 Reader 與 Writer 實作了 Closeable 介面,其父介 面為 AutoCloseable 介面,因此可使用 JDK7 嘗試自動關閉資源語法

(39)

Reader 與 Writer 繼承架構

(40)

Reader 與 Writer 繼承架構

(41)

Reader 與 Writer 繼承架構

• 若要使用 CharUtil.dump() 讀入檔案、轉 為字串並顯示在文字模式中

(42)

Reader 與 Writer 繼承架構

• FileReader 、 FileWriter 可以對檔案 作讀取與寫入,讀取或寫入時預設會使用作 業系統預設編碼來作字元轉換

• 在啟動 JVM 時,可指定 - Dfile.encoding 來指定

FileReader 、 FileWriter 所使用的編

(43)

Reader 與 Writer 繼承架構

• FileReader 、 FileWriter 沒有可以指 定編碼的方法

• 如果在程式執行過程中想要指定編碼,則必 須使用

InpuStreamReader 、 OutputStreamWr iter

(44)

字元處理裝飾器

• 想要將位元組資料轉換為對應的編碼字元,

可以使用

InputStreamReader 、 OutputStreamW riter 對串流資料資料包裹

• 在建立 InputStreamReader 與

OutputStreamWriter 時,可以指定編碼

,如果沒有指定編碼,則以 JVM 啟動時所獲 取的預設編碼來作字元轉換

(45)

字元處理裝飾器

(46)

字元處理裝飾器

• 想以 UTF-8 處理字元資料,例如讀取 UTF-8 的 Main.java 文字檔案,並另存為 UTF-8 的 Main.txt 文字檔案 …

(47)

字元處理裝飾器

• BufferedReader 、 BufferedWriter 可 對 Reader 、 Writer 提供緩衝區作用

• JDK 1.4 之前,標準 API 並沒有 Scanner 類 別,若要在文字模式下取得使用者輸入的字 串,會如下撰寫:

(48)

字元處理裝飾器

• PrintWriter 與 PrintStream 使用上極 為類似,除了可以對 OutptStream 包裹之 外, PrintWriter 還可以對 Writer 進行 包裹,提供

print() 、 println() 、 format() 等方

參考文獻

相關文件

interface ITextBox : IControl// 繼承了介面 Icontrol 的方法 Paint() { void SetText(string text); }. interface IListBox : IControl// 繼承了介面 Icontrol 的方法 Paint() {

以下 Java 程式執行完後,輸出結果為何?(A)無法編譯,因為 Rectangle 類別不能同時 extends 一個類別且 implemets 一個介面(B)無法編譯,因為 Shapes 類別沒有

下列哪一種記憶體屬於非揮發性記憶體, 不會因電源關閉而使其中的資料消 失, 但是可以透過電壓的方式重複抹除資料, 可用於基本輸入/ 輸出系統 (Basic Input / Output System,BIOS)

Google Science Journal 簡介..

Private Sub Form_Click() MsgBox Combo1.ListCount MsgBox Combo1.ListIndex..

Visual Basic提供了許多控制項介面來處理由鍵盤輸入

 真值表必須在關鍵字table table table table及endtable endtable endtable之 endtable 間。. 

在於是否在「知道」與「能做」之外,還 能「識」。而識的媒介與深度,仍然以實