SlideShare a Scribd company logo
Java SE 7 技術手冊投影片第 10 章 - 輸入輸出
CHAPTER 10
• 輸入輸出
            學習目標
            • 瞭解串流與輸入輸出的關係
            • 認識InputStream、
              OutputStream繼承架構
            • 認識Reader、Writer繼承架構
            • 使用輸入輸出裝飾器類別
串流設計觀念
串流設計觀念
• 從應用程式角度來看,如果要將資料從來源
  取出,可以使用輸入串流,如果要將資料寫
  入目的地,可以使用輸出串流
• 輸入串流代表物件為
  java.io.InputStream實例,輸出串流代
  表物件為java.io.OutputStream實例
串流設計觀念
串流設計觀念
• 來源與目的地都不知道的情況下,如何撰寫
  程式?
串流設計觀念
• 在不使用InputStream與OutputStream
  時,必須使用close()方法關閉串流
• InputStream與OutputStream實作了
  java.io.Closeable介面,其父介面為
  java.lang.AutoCloseable介面,因此
  可使用JDK7嘗試自動關閉資源語法
串流設計觀念
• 如果要將某個檔案讀入並另存為另一個檔案 ..
串流設計觀念
• 如果要從HTTP伺服器讀取某個網頁,並另存
  為檔案 …
串流設計觀念
• 使用java.net.ServerSocket接受客戶
  端連線的例子:
串流設計觀念
• 將來學到Servlet,想將檔案輸出至瀏覽器,
  也會有類似的操作:
串流繼承架構
串流繼承架構
串流繼承架構
• 記得System.in與System.out嗎?分別是
  InputStream與PrintStream的實例 …
• 較少直接操作InputStream相關方法,而
  是如先前章節使用java.util.Scanner包
  裹System.in
串流繼承架構
• 可以使用System的setIn()方法指定
  InputStream實例,指定標準輸入來源
• 將標準輸入指定為FileInputStream,可
  以讀取指定檔案並顯示在文字模式
串流繼承架構
• 若要將10.1.1的Download範例改為輸出至標
  準輸出,也可以這麼寫:
串流繼承架構
• 標準輸出可以重新導向至檔案,只要執行程
  式時使用>將輸出結果導向至指定的檔案



• 如果使用>>則是附加訊息
串流繼承架構
• 可以使用System的setOut()方法指定
  PrintStream實例,將結果輸出至指定的
  目的地
• 將標準輸出指定至檔案:
串流繼承架構
• System.err為PrintSteam實例,稱之為
  標準錯誤輸出串流,用來立即顯示錯誤訊息
• System.out輸出的訊息可以使用>或>>重
  新導向至檔案,但System.err輸出的訊息
  一定會顯示在文字模式中,無法重新導向
• 可以使用System.setErr()指定
  PrintStream,指定標準錯誤輸出串流
串流繼承架構
• FileInputStream是InputStream的子類,可
  以指定檔案名稱建構實例,一旦建構檔案就開啟,
  接著就可用來讀取資料
• FileOutputStream是OutputStream的子類,
  可以指定檔案名稱建構實例,一旦建構檔案就開啟,
  接著就可以用來寫出資料
• 無論是FileInputStream或
  FileOutputStream,不使用時都要使用close()
  關閉檔案
串流繼承架構
• FileInputStream主要實作了
  InputStream的read()抽象方法,使之可
  從檔案中讀取資料
• FileOutputStream主要實作了
  OutputStream的write()抽象方法,使之
  可寫出資料至檔案
串流繼承架構
• FileInputStream、
  FileOutputStream在讀取、寫入檔案時,
  是以位元組為單位
• 通常會使用一些高階類別加以包裹,進行一
  些高階操作,像是Scanner與
  PrintStream類別等
串流繼承架構
• ByteArrayInputStream是
  InputStream的子類,可以指定byte陣列
  建構實例,一旦建構就可將byte陣列當作資
  料來源進行讀取
• ByteArrayOutputStream是
  OutputStream的子類,可以指定byte陣
  列建構實例,一旦建構將byte陣列寫作目的
  地寫出資料
串流繼承架構
• ByteArrayInputStream主要實作了
  InputStream的read()抽象方法,使之可
  從byte陣列中讀取資料
• ByteArrayOutputStream主要實作了
  OutputStream的write()抽象方法,使之
  可寫出資料至byte陣列
串流處理裝飾器
• InputStream、OutputStream提供串流
  基本操作,如果想要為輸入輸出的資料作加
  工處理,則可以使用包裹器類別
 – 具備緩衝區作用的BufferedInputStream、
   BufferedOutputStream
 – 具備資料轉換處理作用的DataInputStream、
   DataOutputStream
 – 具備物件序列化能力的ObjectInputStream、
   ObjectOutputStream
串流處理裝飾器
串流處理裝飾器
• 如果傳入IO.dump()的是
  FileInputStream、
  FileOutputStream實例,每次read()時
  都會要求讀取硬碟,每次write()都會要求
  寫入硬碟,這會花費許多時間在硬碟定位上
串流處理裝飾器
• BufferedInputStream與
  BufferedOutputStream主要於內部提供
  緩衝區功能
• 建構BufferedInputStream、
  BufferedOutputStream必須提供
  InputStream、OutputStream進行包裹,
  可以使用預設或自訂緩衝區大小
串流處理裝飾器
串流處理裝飾器
• DataInputStream、
  DataOutputStream提供讀取、寫入Java
  基本資料型的方法,像是讀寫int、double、
  boolean等的方法
Java SE 7 技術手冊投影片第 10 章 - 輸入輸出
Java SE 7 技術手冊投影片第 10 章 - 輸入輸出
串流處理裝飾器
• ObjectInputStream提供readObject()方法將
  資料讀入為物件,而ObjectOutputStream提供
  writeObject()方法將物件寫至目的地
• 可以被這兩個方法處理的物件,必須實作
  java.io.Serializable介面,這個介面並沒有
  定義任何方法,只是作為標示之用,表示這個物件
  是可以序列化的(Serializable)
Java SE 7 技術手冊投影片第 10 章 - 輸入輸出
Java SE 7 技術手冊投影片第 10 章 - 輸入輸出
串流處理裝飾器
• 如果在作物件序列化時,物件中某些資料成
  員不希望被寫入,則可以標上transient關
  鍵字
Reader與Writer繼承架構
Reader與Writer繼承架構
• 在不使用Reader與Writer時,必須使用
  close()方法關閉串流,由於Reader與
  Writer實作了Closeable介面,其父介面
  為AutoCloseable介面,因此可使用JDK7
  嘗試自動關閉資源語法
Reader與Writer繼承架構
Reader與Writer繼承架構
Reader與Writer繼承架構
• 若要使用CharUtil.dump()讀入檔案、轉
  為字串並顯示在文字模式中…
Reader與Writer繼承架構
• FileReader、FileWriter可以對檔案作
  讀取與寫入,讀取或寫入時預設會使用作業
  系統預設編碼來作字元轉換
• 在啟動JVM時,可指定-Dfile.encoding
  來指定FileReader、FileWriter所使用
  的編碼
Reader與Writer繼承架構
• FileReader、FileWriter沒有可以指定
  編碼的方法
• 如果在程式執行過程中想要指定編碼,則必
  須使用InpuStreamReader、
  OutputStreamWriter
字元處理裝飾器
• 想要將位元組資料轉換為對應的編碼字元,
  可以使用InputStreamReader、
  OutputStreamWriter對串流資料資料包
  裹
• 在建立InputStreamReader與
  OutputStreamWriter時,可以指定編碼,
  如果沒有指定編碼,則以JVM啟動時所獲取
  的預設編碼來作字元轉換
字元處理裝飾器
字元處理裝飾器
• 想以UTF-8處理字元資料,例如讀取UTF-8的
  Main.java文字檔案,並另存為UTF-8的
  Main.txt文字檔案 …
字元處理裝飾器
• BufferedReader、BufferedWriter可
  對Reader、Writer提供緩衝區作用
• JDK 1.4之前,標準API並沒有Scanner類別,
  若要在文字模式下取得使用者輸入的字串,
  會如下撰寫:
字元處理裝飾器
• PrintWriter與PrintStream使用上極為
  類似,除了可以對OutptStream包裹之外,
  PrintWriter還可以對Writer進行包裹,
  提供print()、println()、format()等
  方法

More Related Content

What's hot (20)

PDF
Java SE 7 技術手冊投影片第 06 章 - 繼承與多型
Justin Lin
 
PDF
Java SE 7 技術手冊投影片第 05 章 - 物件封裝
Justin Lin
 
PPT
Java SE 8 技術手冊第 15 章 - 通用API
Justin Lin
 
PDF
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫
Justin Lin
 
PPT
Java SE 8 技術手冊第 14 章 - NIO 與 NIO2
Justin Lin
 
PPT
Java SE 8 技術手冊第 12 章 - Lambda
Justin Lin
 
PPT
Java SE 8 技術手冊第 2 章 - 從JDK到IDE
Justin Lin
 
PPT
Java SE 8 技術手冊第 11 章 - 執行緒與並行API
Justin Lin
 
PDF
Java SE 7 技術手冊投影片第 07 章 - 介面與多型
Justin Lin
 
PPT
Java SE 8 技術手冊第 4 章 - 認識物件
Justin Lin
 
PDF
Java SE 7 技術手冊投影片第 09 章 - Collection與Map
Justin Lin
 
PDF
從模組到類別
Justin Lin
 
PPT
Java SE 8 技術手冊第 16 章 - 整合資料庫
Justin Lin
 
PDF
資料永續與交換
Justin Lin
 
PPT
Java SE 8 技術手冊第 3 章 - 基礎語法
Justin Lin
 
PDF
Java SE 7 技術手冊投影片第 02 章 - 從JDK到IDE
Justin Lin
 
PDF
Java SE 7 技術手冊投影片第 13 章 - 視窗程式設計
Justin Lin
 
PDF
Java SE 7 技術手冊投影片第 03 章 - 基礎語法
Justin Lin
 
PPTX
2, object oriented programming
ted-xu
 
PPTX
5. 建構式、原型與類別
Justin Lin
 
Java SE 7 技術手冊投影片第 06 章 - 繼承與多型
Justin Lin
 
Java SE 7 技術手冊投影片第 05 章 - 物件封裝
Justin Lin
 
Java SE 8 技術手冊第 15 章 - 通用API
Justin Lin
 
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫
Justin Lin
 
Java SE 8 技術手冊第 14 章 - NIO 與 NIO2
Justin Lin
 
Java SE 8 技術手冊第 12 章 - Lambda
Justin Lin
 
Java SE 8 技術手冊第 2 章 - 從JDK到IDE
Justin Lin
 
Java SE 8 技術手冊第 11 章 - 執行緒與並行API
Justin Lin
 
Java SE 7 技術手冊投影片第 07 章 - 介面與多型
Justin Lin
 
Java SE 8 技術手冊第 4 章 - 認識物件
Justin Lin
 
Java SE 7 技術手冊投影片第 09 章 - Collection與Map
Justin Lin
 
從模組到類別
Justin Lin
 
Java SE 8 技術手冊第 16 章 - 整合資料庫
Justin Lin
 
資料永續與交換
Justin Lin
 
Java SE 8 技術手冊第 3 章 - 基礎語法
Justin Lin
 
Java SE 7 技術手冊投影片第 02 章 - 從JDK到IDE
Justin Lin
 
Java SE 7 技術手冊投影片第 13 章 - 視窗程式設計
Justin Lin
 
Java SE 7 技術手冊投影片第 03 章 - 基礎語法
Justin Lin
 
2, object oriented programming
ted-xu
 
5. 建構式、原型與類別
Justin Lin
 

Viewers also liked (12)

PDF
Java SE 7 技術手冊投影片第 08 章 - 例外處理
Justin Lin
 
PDF
Java SE 7 技術手冊投影片第 01 章 - Java平台概論
Justin Lin
 
PDF
Java SE 7 技術手冊第六章草稿 - 何謂繼承?
Justin Lin
 
PDF
Java SE 7 技術手冊第七章草稿 - 何謂介面?
Justin Lin
 
PDF
Java SE 7 技術手冊第五章草稿 - 何謂封裝?
Justin Lin
 
PDF
Java SE 7 技術手冊 - 課後練習解答
Justin Lin
 
PPT
Java SE 8 技術手冊第 1 章 - Java平台概論
Justin Lin
 
PDF
Joda-Time & JSR 310 – Problems, Concepts and Approaches
Justin Lin
 
PDF
Java SE 7 技術手冊第二章草稿 - 從 JDK 到 IDE
Justin Lin
 
PDF
淺談 Groovy 與 Gradle
Justin Lin
 
PDF
JDK8 Functional API
Justin Lin
 
PDF
PyCon Taiwan 2013 Tutorial
Justin Lin
 
Java SE 7 技術手冊投影片第 08 章 - 例外處理
Justin Lin
 
Java SE 7 技術手冊投影片第 01 章 - Java平台概論
Justin Lin
 
Java SE 7 技術手冊第六章草稿 - 何謂繼承?
Justin Lin
 
Java SE 7 技術手冊第七章草稿 - 何謂介面?
Justin Lin
 
Java SE 7 技術手冊第五章草稿 - 何謂封裝?
Justin Lin
 
Java SE 7 技術手冊 - 課後練習解答
Justin Lin
 
Java SE 8 技術手冊第 1 章 - Java平台概論
Justin Lin
 
Joda-Time & JSR 310 – Problems, Concepts and Approaches
Justin Lin
 
Java SE 7 技術手冊第二章草稿 - 從 JDK 到 IDE
Justin Lin
 
淺談 Groovy 與 Gradle
Justin Lin
 
JDK8 Functional API
Justin Lin
 
PyCon Taiwan 2013 Tutorial
Justin Lin
 
Ad

Similar to Java SE 7 技術手冊投影片第 10 章 - 輸入輸出 (14)

PDF
輸入輸出
Justin Lin
 
PDF
CH10:輸入輸出
Justin Lin
 
PPT
SCJP ch16
r82093403
 
PPTX
Java_05:檔案輸出輸入機制
Brad Chao
 
ODP
Java 網路程式
PingLun Liao
 
PPTX
13, io
ted-xu
 
PDF
Io 2
Medivh2011
 
PDF
千呼萬喚始出來的 Java SE 7
Justin Lin
 
PDF
NIO 與 NIO2
Justin Lin
 
PDF
CH14:NIO 與 NIO2
Justin Lin
 
PDF
[圣思园][Java SE]Io 3
ArBing Xie
 
PPT
千呼萬喚始出來的Java SE 7
javatwo2011
 
PDF
2006 recycle opensourceprojects
George Ang
 
PDF
Recycle Open Source Projects
George Ang
 
輸入輸出
Justin Lin
 
CH10:輸入輸出
Justin Lin
 
SCJP ch16
r82093403
 
Java_05:檔案輸出輸入機制
Brad Chao
 
Java 網路程式
PingLun Liao
 
13, io
ted-xu
 
千呼萬喚始出來的 Java SE 7
Justin Lin
 
NIO 與 NIO2
Justin Lin
 
CH14:NIO 與 NIO2
Justin Lin
 
[圣思园][Java SE]Io 3
ArBing Xie
 
千呼萬喚始出來的Java SE 7
javatwo2011
 
2006 recycle opensourceprojects
George Ang
 
Recycle Open Source Projects
George Ang
 
Ad

More from Justin Lin (20)

PPTX
Ch14 簡介 Spring Boot
Justin Lin
 
PPTX
Ch13 整合 Spring MVC/Security
Justin Lin
 
PPTX
Ch12 Spring 起步走
Justin Lin
 
PPTX
Ch11 簡介 JavaMail
Justin Lin
 
PPTX
Ch10 Web 容器安全管理
Justin Lin
 
PPTX
Ch09 整合資料庫
Justin Lin
 
PPTX
Ch08 自訂標籤
Justin Lin
 
PPTX
Ch07 使用 JSTL
Justin Lin
 
PPTX
Ch06 使用 JSP
Justin Lin
 
PPTX
Ch05 Servlet 進階 API、過濾器與傾聽器
Justin Lin
 
PPTX
Ch04 會話管理
Justin Lin
 
PPTX
Ch03 請求與回應
Justin Lin
 
PPTX
Ch02 撰寫與設定 Servlet
Justin Lin
 
PPTX
CH1. 簡介 Web 應用程式
Justin Lin
 
PDF
14. 進階主題
Justin Lin
 
PDF
13.並行、平行與非同步
Justin Lin
 
PDF
12. 除錯、測試與效能
Justin Lin
 
PDF
11. 常用內建模組
Justin Lin
 
PDF
10. 資料永續與交換
Justin Lin
 
PDF
9. 資料結構
Justin Lin
 
Ch14 簡介 Spring Boot
Justin Lin
 
Ch13 整合 Spring MVC/Security
Justin Lin
 
Ch12 Spring 起步走
Justin Lin
 
Ch11 簡介 JavaMail
Justin Lin
 
Ch10 Web 容器安全管理
Justin Lin
 
Ch09 整合資料庫
Justin Lin
 
Ch08 自訂標籤
Justin Lin
 
Ch07 使用 JSTL
Justin Lin
 
Ch06 使用 JSP
Justin Lin
 
Ch05 Servlet 進階 API、過濾器與傾聽器
Justin Lin
 
Ch04 會話管理
Justin Lin
 
Ch03 請求與回應
Justin Lin
 
Ch02 撰寫與設定 Servlet
Justin Lin
 
CH1. 簡介 Web 應用程式
Justin Lin
 
14. 進階主題
Justin Lin
 
13.並行、平行與非同步
Justin Lin
 
12. 除錯、測試與效能
Justin Lin
 
11. 常用內建模組
Justin Lin
 
10. 資料永續與交換
Justin Lin
 
9. 資料結構
Justin Lin
 

Java SE 7 技術手冊投影片第 10 章 - 輸入輸出