1、 IO(Input Output)流:IO流用來處理設備之間的數據傳輸
在讀寫字符串時,如果在構造時,傳入第二個參數爲true,將原有文件末尾進行讀寫
close()和flush()的區別?
a.調用flush,可以將數據刷到目的地中,流依然存在,可以繼續使用,
調用close,可以將數據刷到目的地中,流已被關閉,不能繼續使用,最後使用。
b.close不僅刷新緩衝區,還關閉底層資源
創建讀取對象,和數據源先相關聯
2、 裝飾模式:爲了解決給類功能進行增強而出現的。
裝飾類和被裝飾的特點:
a.裝飾類中的構造函數需要接受被裝飾。
b.裝飾類和被裝飾類應該屬於同一個體系
* 裝飾模式:爲了解決給類的功能進行增強而出現的。
* Writer
* |--TextWriter
* |--MediaWriter
* 想要對流對象的功能進行增強,比如提高寫入的效率。
* 使用緩衝技術。
* Writer
* |--TextWriter
* |--BufferedTextWriter
* |--MediaWriter
* |--BufferedMediaWriter
* 每一個子類這樣實現是可以的,但是導致繼承體系較爲臃腫。
* 發現其實無論哪個子類需要高效,使用的都是緩衝技術。
* 乾脆將緩衝技術進行單獨的描述和封裝。
* 要緩衝區誰,就將誰傳給緩衝區。
* BufferdWriter
* class BufferedWriter extends Writer
* {
* BufferedWriter(Writer w)
* {}
* }
* 裝飾設計模式。
* Writer
* |--TextWriter
* |--MediaWriter
* |--BufferedWriter
* 裝飾類和被裝飾的特點:
* 1,裝飾類中的構造函數需要接受被裝飾類。
* 2,裝飾類和被裝飾類應該所屬於同一個體系。
3、 輸入/輸出流
FileOutputStream 輸出流
FileInputStream 輸入流
available 獲取字節數 以他作爲緩衝區的長度是不合適的
4、 轉換流:是字符和字節之間的轉換橋樑
InputStreamReader
OutputStreamWriter
字符能看懂,字節看不懂
轉換流:字節流+編碼表(可以指定)
---用於操作File的子類:字節流+本地默認碼錶(固定)。對默認編碼的字符文件操作起來比父類根爲便捷
5、 IO流的操作規律
字符流:對字符流操作的對象
FileReader
FileWriter
BufferedReader
BufferedWriter
InputStreamReader
OutputStreamWriter
字節流:對字節流操作的對象
FileInputStream
FileOutputStream
BufferedInputStream
BufferedOutputStream
問題:開始時,用哪個流對象解決問題?
明確一:明確源和目的。
源:就需要使用輸入體系。InputStream
Reader
目的:就需要寫,就需要使用輸出體系。OutputStream
Writer
明確二:處理的數據是否是存文本數據。
是:就是使用字符流。
源:Reader
目的:Writer
否:就是字節流。
源:InputStream
目的:OutputStream
兩個明確都確定後,可以確定需要使用哪個體系。
明確三:具體是哪個設備。明確設備的目的是爲了確定具體的對象。
設備源:
鍵盤,System.in
硬盤,操作文件的對象。File開頭的流對象。
內存,數組。
網絡,Socket
目的設備:
硬盤,操作文件的對象。File開頭的流對象。
屏幕(控制檯)System.out
內存,數組。
網絡,Socket
明確四:是否需要額外功能?
需要高效嗎?Buffered
需要字節和字符之間的橋樑嗎?轉換流
6、 list():列出當前目錄下的文件及文件夾的名稱。 目錄不存在反對空
對一個目錄使用list前建議先判斷。
7、 遞歸:函數自身調用自身。功能在內部有進行復用,下次功能實用到了上次功能的運算的內容。
注意;
a. 一定要定義條件。
b. 要控制遞歸次數。
dir.list();獲取的是路徑
dir.listFiles();獲取的是路徑對象
8、 Propertise:map中的Hashtable子類
a. 是一個雙列集合。map中的方法都是可以用。
b. 持久的屬性集,數據的生命週期較長。
c. Properties 可保存在流中加載
d. 鍵值都是字符串類型
9、 PrintStream: 打印流
特點:
a. 給字節輸出流提供了打印方法。
b. 方便打印數值表現形式。
c. 構造函數接受File對象,字符串路徑,OutputStream.
write寫出一個int,只將最低一個字節寫出。
print將數值表現形式不變,寫到目的地中。都將數據轉成字符串。
10、 能操作對象的流對象
ObjiecInputStream
ObjectOutputStream
關鍵字: transient 瞬態
RandomAccessFile
a. 既可以讀取,又可以寫入
b. 只對文件操作;
c. 內部維護了一個大型數組,將字節輸入流和字節輸出流進行封裝。
d. 通過索引的方式對數組中的元素進行操作,獲取和設置索引的方法是getFilePointer,seek.
e. 隨機的訪問的原理:就是通過操作索引的方法對指針進行自定義的指定位置來進行讀寫
f. 讀取時,讀取的字節要有規律
11、 操作基本數據類型值得流對象
a. write(int):將一個整數的四個字節中的最低字節寫入到目的地
b. print(int):將一個整數的表現形式寫入到目的地。你寫的是什麼,到目的地就是什麼。
c. writeInt(int):將一個整數的四個字節寫入到目的地。
12、 編碼和解碼
字符串--->字節數組:編碼
字節數組--->字符串:解碼
String str="你好";
編碼:
byte[]arr=str.getBytes("UTF-8");
解碼:
String s1=new String(arr,"GBK");
原則:
a. 編碼編錯了,就不用解碼了。
b. 解碼解錯還有可能更正
注意會解釋“聯通”的問題