深入理解Java IO

概覽

Java中IO流的體系結構

在這裏插入圖片描述
在這裏插入圖片描述

節點流:程序直接連接到實際的數據源,進行讀寫。

處理流:又稱高級流或包裝流,處理流對一個已存在的流進行連接,通過封裝後的流來進行讀寫。

1. 字節流

InputStream中的三個基本的讀方法
abstract int read():讀取一個字節數據,並返回讀到的數據,如果返回-1,表示讀到了輸入流的末尾。
int read(byte[] b):將數據讀入一個字節數組,同時返回實際讀取的字節數。如果返回-1,表示讀到了輸入流的末尾。
int read(byte[] b, int off, int len):將數據讀入一個字節數組,同時返回實際讀取的字節數。如果返回-1,表示讀到了輸入流的末尾。off指定在數組b中存放數據的起始偏移位置;len指定讀取的最大字節數。

流結束的判斷:方法read()的返回值爲-1時;readLine()的返回值爲null時。

outputStream中的三個基本的寫方法
abstract void write(int b):往輸出流中寫入一個字節。
void write(byte[] b):往輸出流中寫入數組b中的所有字節。
void write(byte[] b, int off, int len) :往輸出流中寫入數組b中從偏移量off開始的len個字節的數據。

其它方法
void flush() :刷新輸出流,強制緩衝區中的輸出字節被寫出。
void close() :關閉輸出流,釋放和這個流相關的系統資源。

2. 字符流

字符流的由來: Java中字符是採用Unicode標準,一個字符是16位,即一個字符使用兩個字節來表示。爲此,JAVA中引入了處理字符的流。因爲數據編碼的不同,而有了對字符進行高效操作的流對象。本質其實就是基於字節流讀取時,去查了指定的碼錶。

字符輸入流Reader主要方法

int read(): 讀取一個字符,返回值爲讀取的字符
int read(char cbuf[]): 讀取一系列字符到數組cbuf[]中,返回值爲實際讀取的字符的數量
abstract int read(char cbuf[],int off,int len): 讀取len個字符,從數組cbuf[]的下標off處開始存放,返回值爲實際讀取的字符數量,該方法必須由子類實現

字符輸出流Writer主要方法

void write(int c):將整型值c的低16位寫入輸出流
void write(char cbuf[]):將字符數組cbuf[]寫入輸出流
abstract void write(char cbuf[],int off,int len):將字符數組cbuf[]中的從索引爲off的位置處開始的len個字符寫入輸出流
void write(String str):將字符串str中的字符寫入輸出流
void write(String str,int off,int len):將字符串str 中從索引off開始處的len個字符寫入輸出流

字節流和字符流的區別

字節流沒有緩衝區,是直接輸出的,而字符流是輸出到緩衝區的。因此在輸出時,字節流不調用colse()方法時,信息已經輸出了,而字符流只有在調用close()方法關閉緩衝區時,信息才輸出。要想字符流在未關閉時輸出信息,則需要手動調用flush()方法。

讀寫單位不同:字節流以字節(8bit)爲單位,字符流以字符爲單位,根據碼錶映射字符,一次可能讀多個字節。

處理對象不同:字節流能處理所有類型的數據(如圖片、avi等),而字符流只能處理字符類型的數據。

結論:只要是處理純文本數據,就優先考慮使用字符流。除此之外都使用字節流。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章