操作對象:
通過流,將對象保存到硬盤上
ObjectOutputStream
構造函數中接收流
通過方法writeObject(Object obj)操作對象
被操作的對象需要實現Serializable接口,使對象序列化,標識對象
需要注意:static修飾的屬性不能被序列化
如果希望非靜態屬性也不被序列化,則在屬性前面加上trasient修飾
管道流:(涉及到多線程)
PipedInputStream和PipedOutputStream
輸入輸出可以直接進行連接
該流對象是阻塞式的,讀取流讀到數據纔會繼續執行,否則會一直等待,直到讀到數據
連接有兩種方法:
1, 直接將流對象做爲構造函數的參數傳入彼此
2, 分別創建對象後通過connect()方法連接
代碼演示:
RandomAccessFile
支持隨機訪問文件的讀取和寫入
該類不是IO體系中子類
而是直接繼承自Object。
但是它是IO包中的成員,因爲它具備讀和寫功能
內部封裝了一個數組,而且通過指針對數組的元素進行操作。
可以通過getFilePointer獲取指針位置。
同時可以通過seek改變指針的位置
其實完成讀寫的原理就是內部封裝了字節輸入流和輸出流
通過構造函數可以看出來,該類只能操作文件,而且還有模式,參數”r”只讀”rw”
讀寫”rws””rwd”
DataInputStream和DataOutputStream
專門用來操作基本數據類型的流對象
操作字節數組
ByteArrayInputStream和ByteArrayOutputStream
ByteArrayInputStream在構造的時候,需要接收數據源,而且數據源是一個字節數組
ByteArrayOutputStream:在構造的時候,不用定義數據目的,因爲該對象中已經封裝了可變長度的字節數組。這就是數據目的地
因爲這兩個對象都操作的數組,並沒有使用系統資源。所以不用關閉流
操作字符數組
CharArrayReader和CharArrayWriter
操作字符串
StringReader和StringWriter
字符集編碼問題:
使用不同的字符集進行讀寫,會出現亂碼
編碼:字符串變成字節數組
解碼:字節數組變成字符串
Stringàbyte[]
Byte[]àString
練習:
五個學生,每個學生有3門課的成績,從鍵盤輸入以上數據(包括姓名,三門課成績),
輸入格式:zhangsan,30,49,60計算出總成績,並把學生的信息和計算出的總分數按高低順序存放在磁盤文件”stud.txt”中。
思路:
1, 描述學生對象
2, 定義操作學生的工具類
思想:
1, 通過鍵盤錄入一行數據,並將信息取出封裝成學生對象
2, 將學生對象存儲到集合中,因爲要按成績排序,所以用TreeSet集合
3, 將集合的信息寫入到一個文件中
返回一個強行逆轉比較器
Comparator<>cmp = Collection.ReverseOrder();