流
流
概念:
流是個抽象的概念,是對輸入輸出設備的抽象,java程序中,對於數據的輸入/輸出操作都是以流的方式進行。設備可以是文件,網絡,內存等。
流具有方向性,至於是輸入流好事輸出流則是一個相對的概念,一般以程序爲參考,如果數據的流向是程序至設備,我們稱爲輸出流,反之我們稱爲輸入流。
可以將流想象成一個“水流管道”,水流就在這管道中形成了,自然就出現了方向的概念。
當程序需要從某個數據源讀入數據的時候,就會開啓一個輸入流,數據源可以是文件,內存或網絡等等。相反地,需要寫出數據到某個數據源目的地的時候,也會開啓一個輸出流,這個數據源目的地也可以是文件,內存或網絡等等。
流的分類
處理的數據單位不同,可分爲:字符流,字節流
數據流方向不同, 可分爲:輸入流,輸出流
功能不同 可分爲:節點流,處理流
節點流
節點流從一個特定的數據源讀寫數據。即節點流是直接操作文件,網絡等的流,
流入FileInputStream和FileOutputStream,他們直接從文件中讀取或往文件中寫入字節流。
處理流
“連接”在已存在的流(節點流或處理流)之上通過對數據的處理爲程序提供更爲強大的讀寫功能。過濾流是使用一個已經存在的輸入流或輸出流連接創建的,過濾流就是對節點進行一系列的包裝。例如BufferedInputStream和BufferedOutputStream,使用已經存在的節點流來構造,提供帶緩衝的讀寫,提高了讀寫的效率,以及DataInputStream和DataOutputStream,使用已經存在的節點流來構造,提供了讀寫java中的基本類型的功能。他們都屬於過濾流。流的結構
Java所有的流類位於java.io包中,都分別繼承一下四種抽象流類型。流的總結:
繼承自InputStream/OutputStream的流都是用於向程序中輸入/輸出數據,且數據的單位都是字節(1byte=8bit)
InputStream 抽象了應用程序讀取數據的方式
OutputStream 抽象了而應用程序寫出數據的方式
EOF = End 讀到-1 就讀到結尾
輸入流基本方法
輸出流基本方法
FileInputStream 具體實現了在文件上讀取數據
FileOutputStream 實現了想文件中寫出byte數據的方法
DataOutputStream/DataInputStream
字節緩衝流(BufferedInputStream 和 BufferedOutputStream)
提高了IO 的性能。從應用程序中把輸入放入文件。
字符流
繼承自Reader/Writer 的流都是用於向程序中輸入/輸出數據,且數據的單位都是字符(2byte=16bit)
操作文本文件
編碼
UTF-8 gbk utf-16be
認識文本和文本文件
字符流(Reader輸入流writer 輸出流)
字符的初六一次處理一個字符
字符的底層仍然是基本的字節序列
字符流的基本實現
InputStreamReader 完成byte流解析爲char流,按照編碼解析
OutputStreamWriter 完成char流到byte流,按照編碼處理
FileWriter和FileReader
字符流過濾流
BufferedReader(一次讀一行)
BufferedWriter/PrinterWriter(一次寫一行)
字符流和字節流的區別
字符流是有java虛擬機將字節轉換爲2個字節的unicode字符爲單位的字符而成的,所以它對奪冠語言支持性比較好!如果是音頻文件,圖片,歌曲,就用字節流好點,如果是關係到中文的,用字符流好點。
所有文件的存儲都是字節的存儲,在磁盤上保留的並不是文件的字符而是先把字符編碼成字節
對象序列化
概念
將Object轉換爲byte序列,反之叫對象的反序列化
例如將對象保存到文件中,或者在網上傳輸,都需要進行對象序列化操作
序列化流(ObjectOutputStream)---writeObject
反序列化流(ObjectInputStream) readObject
序列化接口(Serializable)
對象必須實現序列化接口,才能進行序列化,否則將出現異常,對於這個接口沒有任何方法,只是一個標準。