天天看點

IO流、序列化、裝飾模式 筆記

Java的IO流是實作輸入和輸出的基礎,可以友善的實作資料的輸入和輸出操作。在java中把不同的輸入/輸出源(鍵盤,檔案,網絡連接配接等)抽象表述為“流”(stream)。

按照 流的檔案類型:位元組流(InputStream、OutputStream)和字元流(Reader,Writer)

按照 流的流向:輸入流和輸出流

按照 功能 :節點流 和 過濾流

IO流、序列化、裝飾模式 筆記

所有檔案資料(文本、圖檔、視訊等)在存儲時,都是二進制數字的形式,也就是一個一個的位元組,傳輸時一樣如此。是以,位元組流可以傳輸任意檔案資料。

絕對路徑:一個完整的路徑,以盤符開頭,例如F://123.txt

相對路徑:一個簡化的路徑,不以盤符開頭,例如//123.txt//b.txt。

getAbsolutePath() :傳回此File的絕對路徑名字元串。

getPath() :将此File轉換為路徑名字元串。

getName() :傳回由此File表示的檔案或目錄的名稱。

length() :傳回由此File表示的檔案的長度(位元組)

如果File是目錄,則傳回值未指定。

exists() :此File表示的檔案或目錄是否存在。

isDirectory() :此File表示的是否為 目錄。

isFile() :此File表示的是否為 檔案。

createNewFile() :檔案不存在,建立一個新的空檔案并傳回true,檔案存在,不建立檔案并傳回false。

delete() :删除由此File表示的檔案或目錄。

mkdir() :建立由此File表示的目錄。如果父類不存在,則建立失敗

mkdirs():建立由此File表示的目錄,同時建立不存在的父級目錄。

是以一般選用 mkdirs()

那麼什麼時候用位元組流什麼時用字元流呢

在周遊檔案時候,一般選擇字元流

而對檔案的内容進行讀寫操作時一般用位元組流

無論使用什麼樣的流對象,底層傳輸的始終為二進制資料。但在用字元流讀寫檔案内容時,規定的字元容器可能會大于需要讀寫的的内容(位元組)

public FileOutputStream(File file):以File對象為參數建立對象。

public FileOutputStream(String name): 以名稱字元串為參數建立對象。

開發常用第二種,指定路徑字元串

注意:建立輸出流對象的時候,如果路徑不存在,系統會自動去對應位置建立對應檔案

輸入流對象的時候,檔案不存在則會報FileNotFoundException異常

當我向有資料的檔案中寫出位元組時,可以傳入第二個參數Boolean

boolean為ture時,表示追加資料,不會對中繼資料進行覆寫。

false 表示不追加 也就是清空原有資料。

構造方法類比輸出流

同樣推薦第二種狗構造方法

當你建立一個流對象時,傳入的路徑下,該檔案,會抛出

輸出結果為 ab cd ed

為何:因為長度為2的數組,每次讀取2個字元,下次讀取時,另外兩個字元将原字元覆寫

第一次:ab

第二次:c覆寫a,d覆寫b 結果為cd

第三次:e覆寫d,原來的d沒有被覆寫,是以結果為 ed

close() :關閉流

flush() :強制緩沖的輸出位元組寫出。

write(byte[] b):将Byte數組 .length()個位元組數組寫入輸出流。

write(byte[] b, int off, int len) :從偏移量 off開始輸出到此輸出流,讀取len個字元

write(int b) :将指定的位元組輸出流。

建立流對象時,會建立一個内置的預設大小的緩沖區數組,通過緩沖區讀寫,減少系統IO次數,進而提高讀寫的效率。

public BufferedInputStream(InputStream in) :建立一個新的緩沖輸入流,注意參數類型為InputStream。

位元組輸出流一樣。

舉例:

編碼:字元(能看懂的) –> 位元組(看不懂的)

解碼:位元組(看不懂的) –> 字元(能看懂的)

FileReader 讀取項目中的文本檔案。由于IDEA的設定,都是預設的UTF-8編碼

但是,由于Windows系統的預設是GBK編碼,讀取Windows系統中建立的文本檔案時,就會出現亂碼。

Java 提供了一種對象序列化的機制。用一個位元組序列可以表示一個對象,該位元組序列包含該對象的資料、對象的類型和對象中存儲的屬性等資訊。位元組序列寫出到檔案之後,相當于檔案中持久儲存了一個對象的資訊

1.該類必須實作java.io.Serializable 接口,Serializable 是一個标記接口,不實作此接口的類将不會使任何狀态序列化或反序列化,會抛出NotSerializableException 。

2.該類的所有屬性必須是可序列化的。如果有一個屬性不需要可序列化的,則該屬性必須注明是瞬态的,使用transient 關鍵字修飾。

一種類與類互動的模式

繼續閱讀