Java I/O一.總覽

本文主要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ù)。

  1. 字節(jié)流:數(shù)據(jù)流中最小的數(shù)據(jù)單元是字節(jié)
  2. 字符流:數(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
  1. File(文件特征與管理):用于文件或者目錄的描述信息,例如生成新目錄,修改文件名,刪除文件,判斷文件所在路徑等。
  2. InputStream(字節(jié)流,二進(jìn)制格式操作):抽象類,基于字節(jié)的輸入操作,是所有輸入流的父類。定義了所有輸入流都具有的共同特征。
  3. OutputStream(字節(jié)流,二進(jìn)制格式操作):抽象類?;谧止?jié)的輸出操作。是所有輸出流的父類。定義了所有輸出流都具有的共同特征。
  4. Reader(字符流,文本格式操作):抽象類,基于字符的輸入操作。
  5. Writer(字符流,文本格式操作):抽象類,基于字符的輸出操作。
  6. RandomAccessFile(隨機(jī)文件操作):它的功能豐富,可以從文件的任意位置進(jìn)行存?。ㄝ斎胼敵觯┎僮?/strong>。
I/O體系

主要包括如下三個層次:

  1. 流式部分――IO的主體部分;
  2. 非流式部分――主要包含一些輔助流式部分的類,如:File類、RandomAccessFile類和FileDescriptor等類;
  3. 其他類–文件讀取部分的與安全相關(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)典)
官方文檔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容