一頭紮進 Java IO中,一頭紮進javaio中
Java IO 概述
在這一小節,我會試著給出Java IO(java.io)包下所有類的概述。更具體地說,我會根據類的用途對類進行分組。這個分組將會使你在未來的工作中,進行類的用途判定時,或者是為某個特定用途選擇類時變得更加容易。
輸入和輸出 – 資料來源和目標媒介
術語“輸入”和“輸出”有時候會有一點讓人疑惑。一個應用程式的輸入往往是另外一個應用程式的輸出。那麼OutputStream流到底是一個輸出到目的地的流呢,還是一個產生輸出的流?InputStream流到底會不會輸出它的資料給讀取資料的程式呢?就我個人而言,在第一天學習Java IO的時候我就感覺到了一絲疑惑。(校對註:輸入資料流可以理解為向記憶體輸入,輸出資料流可以理解為從記憶體輸出)
為了消除這個疑惑,我試著給輸入和輸出起一些不一樣的別名,讓它們從概念上與資料的來源和資料的流向相聯絡。
Java的IO包主要關注的是從未經處理資料源的讀取以及輸出未經處理資料到目標媒介。以下是最典型的資料來源和目標媒介:
- 檔案
- 管道
- 網路連接
- 記憶體緩衝
- System.in, System.out, System.error(註:Java標準輸入、輸出、錯誤輸出)
下面這張圖描繪了一個程式從資料來源讀取資料,然後將資料輸出到其他媒介的原理:
流
在Java IO中,流是一個核心的概念。流從概念上來說是一個連續的資料流。你既可以從流中讀取資料,也可以往流中寫資料。流與資料來源或者資料流向的媒介相關聯。在Java IO中流既可以是位元組流(以位元組為單位進行讀寫),也可以是字元流(以字元為單位進行讀寫)。
類InputStream, OutputStream, Reader 和Writer
一個程式需要InputStream或者Reader從資料來源讀取資料,需要OutputStream或者Writer將資料寫入到目標媒介中。以下的圖說明了這一點:
InputStream和Reader與資料來源相關聯,OutputStream和writer與目標媒介相關聯。
Java IO的用途和特徵
Java IO中包含了許多InputStream、OutputStream、Reader、Writer的子類。這樣設計的原因是讓每一個類都負責不同的功能。這也就是為什麼IO包中有這麼多不同的類的緣故。各類用途匯總如下:
- 檔案訪問
- 網路訪問
- 記憶體緩衝訪問
- 線程內部通訊(管道)
- 緩衝
- 過濾
- 解析
- 讀寫文本 (Readers / Writers)
- 讀寫基本類型資料 (long, int etc.)
- 讀寫對象
當通讀過Java IO類的原始碼之後,我們很容易就能瞭解這些用途。這些用途或多或少讓我們更加容易地理解,不同的類用於針對不同業務情境。
Java IO類概述表
已經討論了資料來源、目標媒介、輸入、輸出和各類不同用途的Java IO類,接下來是一張通過輸入、輸出、基於位元組或者字元、以及其他比如緩衝、解析之類的特定用途劃分的大部分Java IO類的表格。