1. 程式人生 > >IO流常見知識點學習

IO流常見知識點學習

位元(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為要釋放的資源
	}