本文主要Java 的 I/O最重要5個類、一個接口。
數(shù)據(jù)流
數(shù)據(jù)流是什么
數(shù)據(jù)流是一組有序,有起點和終點的字節(jié)的數(shù)據(jù)序列,包括輸入流和輸出流。
- 數(shù)據(jù)流是一串連續(xù)不斷的數(shù)據(jù)的集合,就象水管里的水流,在水管的一端一點一點地供水,而在水管的另一端看到的是一股連續(xù)不斷的水流。
- 寫入
數(shù)據(jù)寫入程序可以是一段、一段地向數(shù)據(jù)流管道中寫入數(shù)據(jù),這些數(shù)據(jù)段會按先后順序形成一個長的數(shù)據(jù)流。 - 讀取
對數(shù)據(jù)讀取程序來說,看不到數(shù)據(jù)流在寫入時的分段情況,每次可以讀取其中的任意長度的數(shù)據(jù),但只能先讀取前面的數(shù)據(jù)后,再讀取后面的數(shù)據(jù)(不能隨機(jī)讀?。?/strong>。 - 效果
不管寫入時是將數(shù)據(jù)分多次寫入,還是作為一個整體一次寫入,讀取時的效果都是完全一樣的。
數(shù)據(jù)流分類
按類型
流序列中的數(shù)據(jù)既可以是未經(jīng)加工的原始二進(jìn)制數(shù)據(jù),也可以是經(jīng)一定編碼處理后符合某種格式規(guī)定的特定數(shù)據(jù)。
- 字節(jié)流:數(shù)據(jù)流中最小的數(shù)據(jù)單元是字節(jié)
- 字符流:數(shù)據(jù)流中最小的數(shù)據(jù)單元是字符, Java中的字符是Unicode編碼,一個字符占用兩個字節(jié)
按方向(站在程序的角度)
- 輸入流
程序從輸入流讀取數(shù)據(jù)源。數(shù)據(jù)源包括外界(鍵盤、文件、網(wǎng)絡(luò)…),即是將數(shù)據(jù)源讀入到程序的通信通道。 - 輸出流
程序向輸出流寫入數(shù)據(jù)。將程序中的數(shù)據(jù)輸出到外界(顯示器、打印機(jī)、文件、網(wǎng)絡(luò)…)的通信通道。
意義
- 采用數(shù)據(jù)流的目的就是使得輸出輸入獨立于設(shè)備
Input Stream不關(guān)心數(shù)據(jù)源來自何種設(shè)備(鍵盤,文件,網(wǎng)絡(luò))
Output Stream不關(guān)心數(shù)據(jù)的目的是何種設(shè)備(鍵盤,文件,網(wǎng)絡(luò))
存儲
存儲方式
在電腦上的數(shù)據(jù)有三種存儲方式
外存:電腦上的硬盤,磁盤,U盤
內(nèi)存:內(nèi)存條
緩存:CPU
對比
存儲量(依次遞減): 外存-->內(nèi)存-->緩存
讀取速度(依次遞減): 緩存-->內(nèi)存-->外存
Java 的 I/O
- 主要是指使用Java進(jìn)行輸入,輸出操作
- Java 的 I/O 操作類在包 java.io 下
- Java所有的I/O機(jī)制都是基于數(shù)據(jù)流進(jìn)行輸入輸出,這些數(shù)據(jù)流表示了字符或者字節(jié)數(shù)據(jù)的流動序列
最重要5個類、一個接口
- 5個類指的是File、OutputStream、InputStream、Writer、Reader
- 一個接口指的是Serializable
- File(文件特征與管理):用于文件或者目錄的描述信息,例如生成新目錄,修改文件名,刪除文件,判斷文件所在路徑等。
- InputStream(字節(jié)流,二進(jìn)制格式操作):抽象類,基于字節(jié)的輸入操作,是所有輸入流的父類。定義了所有輸入流都具有的共同特征。
- OutputStream(字節(jié)流,二進(jìn)制格式操作):抽象類?;谧止?jié)的輸出操作。是所有輸出流的父類。定義了所有輸出流都具有的共同特征。
- Reader(字符流,文本格式操作):抽象類,基于字符的輸入操作。
- Writer(字符流,文本格式操作):抽象類,基于字符的輸出操作。
- RandomAccessFile(隨機(jī)文件操作):它的功能豐富,可以從文件的任意位置進(jìn)行存?。ㄝ斎胼敵觯┎僮?/strong>。

I/O體系
主要包括如下三個層次:
- 流式部分――IO的主體部分;
- 非流式部分――主要包含一些輔助流式部分的類,如:File類、RandomAccessFile類和FileDescriptor等類;
- 其他類–文件讀取部分的與安全相關(guān)的類,如:SerializablePermission類,以及與本地操作系統(tǒng)相關(guān)的文件系統(tǒng)的類,如:FileSystem類和Win32FileSystem類和WinNTFileSystem類。
I/O流

I/O流
java I/O 的設(shè)計使用到了 Decorator(裝飾器)模式,按功能劃分Stream,您可以動態(tài)裝配這些 Stream,以便獲得您需要的功能。
如FilterInputStream和FilterOutputStream是抽象裝飾角色,而其他派生自它們的類則是具體裝飾角色。
常用方法
Inputstream
| 方法 | 作用 | 一些返回值 |
|---|---|---|
public abstract int read( )
|
讀取一個byte的數(shù)據(jù) | 若返回值=-1說明沒有讀取到任何字節(jié)讀取工作結(jié)束 |
public int read(byte b[ ])
|
讀取b.length個字節(jié)的數(shù)據(jù)放到b數(shù)組中。該方法實際上是調(diào)用下一個方法實現(xiàn)的 | 返回值是讀取的字節(jié)數(shù) |
public int read(byte b[ ], int off, int len)
|
從輸入流中最多讀取len個字節(jié)的數(shù)據(jù),存放到偏移量為off的b數(shù)組中 | |
| public int available( ) | 返回輸入流中可以讀取的字節(jié)數(shù)。注意:若輸入阻塞,當(dāng)前線程將被掛起,如果InputStream對象調(diào)用這個方法的話,它只會返回0,這個方法必須由繼承InputStream類的子類對象調(diào)用才有用 | |
| public long skip(long n) | 忽略輸入流中的n個字節(jié) | 返回值是實際忽略的字節(jié)數(shù) |
| public int close( ) | 使用完后,必須對我們打開的流進(jìn)行關(guān)閉。 |
OutputStream
| 方法 | 作用 |
|---|---|
public void write(byte b[ ])
|
將參數(shù)b中的字節(jié)寫到輸出流 |
public void write(byte b[ ], int off, int len)
|
將參數(shù)b的從偏移量off開始的len個字節(jié)寫到輸出流 |
public abstract void write(int b)
|
先將int轉(zhuǎn)換為byte類型,把低字節(jié)寫入到輸出流中 |
| public void flush( ) | 將數(shù)據(jù)緩沖區(qū)中數(shù)據(jù)全部輸出,并清空緩沖區(qū) |
| public void close( ) | 關(guān)閉輸出流并釋放與流相關(guān)的系統(tǒng)資源 |
參考文章
深入分析 Java I/O 的工作機(jī)制
java回憶錄—輸入輸出流詳細(xì)講解(入門經(jīng)典)
官方文檔