回調(又稱爲callback):能夠理解爲一個接口提供一些方法給其餘類用,但同時其餘類在調用它時,它又調用其餘類給它的條件(重寫)。
單獨一個隨機訪問文件類: RondomAccessFile類容許隨機訪問文件同時擁有讀和寫的功能。
其中方法: close(),read(),writer(),seek(),getFilePointer()這須要注意:這是在有seek()前提下。
流:
一.I/O 流(java 如何實現與外界數據的交流)
流定義:
任何有能力產出數據的數據源對象或者有能力接收數據的數據源對象。他屏蔽了實際的I/O設備處理數據的細節。
1.Input/Output:指跨越出了JVM 的邊界,與外界數據的源頭或者目標數據源進行數據交換。
2.流的分類:
按流向分爲輸入流和輸出流;
按傳輸單位分爲字節流(Stream)結尾的和字符流(Reader和Writer);
按功能還能夠分爲節點流和過濾流。
節點流:負責數據源和程序之間創建鏈接;(至關於裸槍)
過濾流:用於給節點增長功能。(至關於功能零部件)
過濾流的構造方式是以其餘流位參數構造(這樣的設計模式稱爲裝飾模式)。
注:I/O流是一類很寶貴的資源,使用完後必須調用close()方法關閉流並釋放資源。在關閉流時只用關閉最外層的流。
3.File 類(java.io.*)可表示一個文件,也有多是一個目錄
(在JAVA 中文件和目錄都屬於這個類中,並且區分不是很是的明顯
4.Java.io 下的方法是對磁盤上的文件進行磁盤操做,可是沒法讀取文件的內容。
注意:建立一個文件對象和建立一個文件在JAVA 中是兩個不一樣的概念。前者是在虛擬機中建立了一個文件,
但卻並無將它真正地建立到OS 的文件系統中,隨着虛擬機的關閉,這個建立的對象也就消失了。
而建立一個文件纔是在系統中真正地創建一個文件。
二File類:咱們猛看起來像是文件,其實他也能夠指代一個文件集,看成爲文件集時咱們能夠對此調用List方法。
這個類的經常使用構造有:File("路徑"),File(「前邊路徑」,「後邊路徑」)File(File,「路徑」)
這個類的經常使用方法:exists(),delete(),getName(),getPath(),isDirectory(),isFile(),length(),
listFile(FileFilter),主要用來過濾文件這裏有(能夠用來嵌套內部類)
mkdir(),mkdirs(),toString(),
FileFilter接口只有accept方法,其返回值爲Boolean型,能夠在其裏邊寫一些正則表達式來對文件進行篩選。
這裏須要注意的是傳入accept的參數必須是final類型(匿名內部類的要求),這樣他才能使用該類範圍以外的隊像。
順便講講:內部類優勢 高聚攏性,缺點在於不易閱讀,謹慎使用。
三 字節流:
InputStream/OutputStream 全部輸入輸入流的父類,是抽象類。
子類有:FileInputStream/FileOutputStream(節點流)(注意FileInputStream(path名,boolean)Boolean爲true 表示拼接)
DataInputStream/DataOutputStream 數據輸入流容許應用程序以與"機器無關方式"
從底層輸入流中讀取基本 Java 數據類型 (8種基本類型,加一種String)讀入寫出時類型必須一致
BufferedInputStream/BufferedOutputStream 字節緩衝流 用於給節點流增長一個緩衝的功能。(典型的犧牲空間換時間)
1.字節輸入流:io包中的InputStream爲全部字節輸入流的父類。
Int read();讀入一個字節(每次一個);
可先使用new byte[]=數組,調用read(byte[] b)
read (byte[])返回值能夠表示有效數;read (byte[])返回值爲-1 表示結束。
2.在流中close()方法由程序員控制。由於輸入輸出流已經超越了JVM的邊界,因此有時可能沒法回收資源。
原則:凡是跨出虛擬機邊界的資源都要求程序員本身關閉,不要期望垃圾回收。
4、字節流的字符編碼:
字符編碼把字符轉換成數字存儲到計算機中,按ASCii 將字母映射爲整數。
把數字從計算機轉換成相應的字符的過程稱爲解碼。
亂碼的根源在於編解碼方式不統一。在世界上任何一種編碼方式中都會向上兼容ASCII碼。因此英文沒有亂碼。
編碼方式的分類:
ASCII(數字、英文):1 個字符佔一個字節(全部的編碼集都兼容ASCII)
ISO8859-1(歐洲):1 個字符佔一個字節
GB-2312/GBK:1 個字符佔兩個字節。GB表明國家標準。
GBK是在GB-2312上增長的一類新的編碼方式,也是如今最經常使用的漢字編碼方式。
Unicode: 1 個字符佔兩個字節(網絡傳輸速度慢)
UTF-8:變長字節,對於英文一個字節,漢字三個字節。
原則:保證編解碼方式的統一,才能不至於出現錯誤。
I/O學習種常範的兩個錯誤 1。忘了加flush2.沒有加換行。
五。字符流
Reader/Writer全部字符流的父類
其子類有
InputStreamReader/OutputStreamWriter 稱爲從字節流到字符流的橋轉換類。這個類能夠設定字符轉換方式
FileReader/FileWriter (FileInputStream/FileOutputStream和InputStreamReader/OutputStreamWriter)的組合,只能是本地默認編碼
Bufferedreader/BufferedWriter 字符緩衝流,其特有方法readLine()讀取一個文本行,newLine()表示Writer到下一個文本行
六 。
一.對象序列化
1. 定義:把一個對象經過I/O流寫到文件(持久性介質)上的過程叫作對象的序列化。
2. 序列化接口:Serializable
此接口沒有任何的方法,這樣的接口稱爲標記接口。
3. 不是全部對象都能序列化的,只有實現了Serializable的類,他的實例對象纔是可序列化的。
4. 在Java種定義了一套序列化規範,對象的編碼和解碼方式都是已經定義好的。
5. class ObjectOutputStream 和ObjectInputStream也是過濾流,使節點流直接得到輸出對象。
ganbin@tarena.com.cn
最有用的方法:
(1)writeObject(Object b)
(2)readObject();該方法返回的是讀到的一個對象,可是須要咱們注意的是,該方法不會以返回null表示讀到文件末尾。
而是當讀到文件末尾時會拋出一個IOException;
6. 序列化一個對象並不必定會序列化該對象的父類對象
7. 瞬間屬性(臨時屬性)不參與序列化過程。
8. 全部屬性必須都是可序列化的,特別是當有些屬性自己也是對象的時候,要尤爲注意這一點。序列化的集合就要求集合中的每個元素都是可序列化的。
9. 用兩次序列化把兩個對象寫到文件中去(以追加的方式),
和用一次序列化把兩個對象寫進文件的大小是不同的。
由於每次追加時都會要在文件中加入一個開始標記和結束標記。因此對於對象的序列化不能以追加的方式寫到文件中。 java
流的分類: