IO流常見知識點學習
阿新 • • 發佈:2019-01-03
位元(Bit)、位元組(Byte)
- 位元是計算機最小的二進位制單位,是最小的傳輸單位,取值為0或者1
- Byte表示位元組,有8個位元位,是最小的儲存單位。
輸入流與輸出流
- 按照傳輸方向分為輸出流和輸入流
- 輸入流:指的是將流從外部檔案輸入到程式中(read讀進來)
- 輸出流:指的是將流從程式中輸出到外部檔案中去(write寫出去)
- 也可以將內容從一個檔案輸到另一個檔案,比如copy,因此程式作為輸入與輸出的中轉部分
字元流、位元組流
- 按照出傳輸流的資料單位分為位元組流和字元流
- 位元組流:位元組流是按照位元組去讀寫資料的,讀取是以單個位元組為單位,操作物件一般為二進位制檔案,根類是InputStream和OutputStream
- 字元流:按照字元去讀取資料的,一般用於字元檔案,字元流是由java虛擬機器將單個位元組轉換為兩個位元組的unicode字元,操作物件一般為文字,根類為Reader和Writer
- InputStream、OutputStream、Reader、Writer都是抽象類
節點流和處理流
- 按照功能劃分為節點流和處理流
- 節點流:直接與資料來源進行連線,用於資料的輸入與輸出
- 處理流(包裝流):不直接連線到資料來源或者目的地,是其他流進行封裝,他的構造方法主要是傳入節點流的子類,處理流的子類必須傳入節點流的子類。主要是簡化操作和提高效能
- 關係:節點流處於第一線,所有的操作都通過他們進行操作,處理流是進行簡化
轉換流
- InputStreamReader:是Reader的子類,是從位元組流到字元流的橋樑。它讀取位元組,並使用指定的字符集將其解碼為字元。它的字符集可以由名稱指定,也可以接受平臺的預設字符集。
- OutputStreamWriter:是Writer的子類,是從字元流到位元組流的橋樑。使用指定的字符集講字元編碼為位元組。它的字符集可以由名稱指定,也可以接受平臺的預設字符集。
位元組陣列流
- 位元組陣列輸入流ByteArrayInputStream:在記憶體中建立一個位元組陣列緩衝區,從輸入流中讀取的資料儲存在位元組陣列緩衝區中,從位元組陣列中讀取資料。
- 位元組陣列輸出流ByteArrayOutputStream:在建立位元組陣列輸出流的同時,記憶體會為該輸出流建立一個預設大小的位元組陣列,用來儲存寫入的位元組內容。
- 使用位元組陣列時會使用到多型,也就是方法的重寫。
- 所有的東西都可以讀到位元組陣列
- 位元組陣列:是一個記憶體,與作業系統無關,陣列流無需關閉,位元組陣列為二進位制,量少,否則記憶體會爆滿,轉換為位元組陣列後方便網路的傳輸
緩衝流
- 位元組緩衝流:BufferedInputStream和BufferedOutputStream
- 字元緩衝流:BufferedReader和BufferedWriter
手動釋放規則,從裡到外釋放
Serializable介面
- Serializable介面是一種標記介面,實現這個介面可以啟動java序列化機制,自動完成儲存物件和陣列的過程。
- 儲存物件的過程稱為物件序列化,讀取物件的過程稱為物件的反序列化。
- 序列化:序列化是處理物件流的一種機制,將物件轉化為二進位制檔案存到硬碟上
- 反序列化:是將儲存在硬碟上的物件二進位制檔案轉化為物件讀到程式中
- 要實現物件的序列化必須實現Serializable介面,該介面沒有任何方法,可以理解為一個標記,表明這個類是可序列化的。
- SerivalVersionUID欄位的作用:這是版本號,保持版本號一直來進行序列化,防止序列化出錯。
關閉流
- 在實際開發中,經常會在程式中開啟一些物理資源,如資料庫的連線,網路連線,磁碟檔案等,開啟這些資源呢必須顯示關閉,否則會引起的資源洩露。
- JVM中的垃圾回收機制屬於java記憶體管理的一部分,他只回收堆記憶體中分配出來的記憶體,至於程式中開啟的物理資源垃圾回收機制是無能為力的。
不關閉流的影響
如果不關閉資源或者不正確的關閉資源,會導致程式還在佔用著資源,浪費資源,隨著執行時間的加倍,一方面會記憶體洩露,另一方面會導致其他資源的程式碼獲取不到資源,這樣獲取資源的執行緒會在獲取資源上卡住。
關於資源洩露
- 資源是存在於記憶體中的,資源洩露也叫做記憶體洩露。還有一種特指的記憶體洩露,指的是動態分配得到一個記憶體塊,在使用完成後,忘記釋放,這是單純的記憶體洩露。
- 作業系統規定,程序申請的記憶體,只要沒釋放,且程序沒有中止,那麼這個記憶體就是屬於程序的,這塊記憶體就不能被其他程序所使用。如果你之前申請的記憶體,在使用完後沒有釋放,然後又重新申請,這樣之前的記憶體沒有任何指標指向,也就無法操作,對於你的程序來說,這個記憶體就丟失了
如何關閉流
//使用可變引數關閉流
public static void clo(Closeable...ios) {
for(Closeable io:ios)
if(null != io)
try {
io.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//使用try-with-resources方法關閉流
try(inputStream;outputStream){
//inputStream;outputStream為要釋放的資源
}