File型別、javaBean規範、IO流、位元組流(4種)、Serializable序列化介面、transient
*File型別: java.io.File型別,可以對硬碟上的檔案/目錄,進行操作。 如檢視檔案/目錄的屬性資訊, 建立,刪除檔案/目錄. 此型別不能檢視和修改檔案裡的"內容"。 --常用構造器: File(String pathname): 指定一個路徑,建立一個File物件 路徑: (1)檔案的路徑,要寫到檔案的副檔名為止 (2)目錄的路徑,要寫到當前目錄的名稱為止 ======================================================================= java.io.File型別 一、概念: 可以用來建立,刪除檔案/目錄,還可以檢視檔案/目錄的屬性資訊。 但是不可以修改檔案裡的資料。如果需要修改,應該使用輸入/輸出流。 二、常用構造器: File(String pathname): 建立一個指定路徑的File物件 File(File parent,String child): 在指定parent路徑下,建立一個child的file物件 File(String parent,String child): 在指定parent路徑下,建立一個child的file物件 三、絕對路徑:是從根目錄開始寫的路徑. window: 從碟符開始書寫: D:\a\f1.txt D:\a\b linux: /home/scott/f1.txt /home/scott 相對路徑: 相對某一檔案/目錄的路徑,不是從根路徑書寫。 reg: f2.txt相對於a目錄的路徑: window: b\f2.txt linux: b/f2.txt reg: f3.txt相對於f2.txt的路徑 ../c/f3.txt 四、常用方法 boolean exists(); 判斷指定的路徑是否存在 boolean isFile(); 判斷指定路徑是不是檔案 boolean isDirectory(); 判斷指定路徑是不是目錄 String getName(); 獲取檔案/目錄名稱 long lastModified(); 獲取檔案/目錄的最後修改時間 boolean isAbsolute(); 判斷指定路徑是不是絕對路徑 String getAbsolutePath(); 獲取絕對路徑 String getParent(); 獲取父目錄的路徑 long length(); 獲取檔案大小 檔案/目錄建立方法: boolean createNewFile(); 建立檔案 boolean mkdir(); 建立目錄 boolean mkdirs(); 建立多級目錄 檔案/目錄的刪除方法: boolean delete(): 可以刪除檔案,刪除目錄時,需要目錄下沒有檔案或子目錄(即空目錄) File[] listFiles(): 獲取目錄裡的file物件
五.遞迴: 遞迴思想:分成"遞與歸"。一層層遞進,最後再一層層歸。 兩種遞迴: (1)方法呼叫自己 (2)方法A呼叫方法B,方法B呼叫A 舉例: n*(n-1)*......*1 z = f(n) 計算n的階乘 = n*f(n-1) = n*(n-1)*f(n-2) = n*(n-1)*......*1 f(n)是一個函式: 裡的邏輯: n*f(n-1) 練習: 斐波那契數列: 第n個數是第n-1個數與第n-2個數的和。 1,1,2,3,5,8,13,....... 計算第10個數的值。 ======================================================================= *javaBean規範: 程式開發者預設遵循的一種規範 (1)提供兩個構造器 (2)給成員變數提供get/set方法 String name getName() setName(String name); Bean:豆子的意思,get/set方法名上的後續單詞稱之為bean. 在命名方法時,作為bean的單詞,首字母要大寫, 成員變數要儘可能的與bean名一致,首字母小寫。 (3)重寫hashCode方法和equals方法 (4)重寫toString() ======================================================================= ======================================================================= *IO流:(Input,Output) 我們在做專案時,除了自定義的一些資料外,還可能需要從"外界"引入資料, 或者將資料匯出到"外界". 這時,我們需要I/O操作。 外界:指的可能是 鍵盤,顯示器,硬碟,另外一個程式。 輸入:又叫讀入操作 資料是從"外界"流向程式 輸出:又叫寫出操作 資料是從程式流向"外界"
流: 就是資料序列, 一經建立成功,就會開啟一個通道。 所以使用完應該進行關閉操作。 --IO流的分類: (1)按照流向分類: 輸入流 輸出流 (2)按照處理的資料單位分類: 位元組流 字元流 (3)按照功能分類: 節點流:直接連線兩個裝置的流型別 處理流:對節點流再次封裝與處理的流型別 或者: 高階流: 低階流: ---------------------------------------------------- --位元組流(4種): 抽象父類 InputStream/OutputStream
一、位元組輸入輸出流: (低階流) 抽象父類: InputStream(定義了位元組輸入流的常用方法) int available(); void close(); int read(); 讀取一個位元組,存入int的低八位上,範圍是0-255 int read(byte[] b); 嘗試一次讀取bs.length個位元組存入位元組陣列b中, 返回的是讀取的有效位元組個數。 int read(byte[] b,int off,int len); skip(int n); 抽象父類: OutputStream(定義了位元組輸出流的常用方法) void close(); void flush(); 沖刷,作用是將(緩衝區中)流的資料,沖刷進檔案中 void write(int b); 寫一個位元組,寫的是int值的低八位 void write(byte[] b); 寫一個位元組陣列 void write(byte[] b,int off,int len); 子類: 1. FileInputStream/FileOutputStream: 繼承了位元組流的抽象父類。重寫了方法,並且提供了自己獨有的方法 構造器: FileInputStream(File file) FileInputStream(String path) FileOutputStream(File file) FileOutputStream(File file,boolean append) FileOutputStream(String pathname) FileOutputStream(String pathname,boolean append) PS:所有的輸出流,對於指定的路徑中的檔案若是不存在, 都會自動建立。
2.緩衝流: (高階流) --BufferedOutputStream:位元組緩衝輸出流 在寫資料時,如果一個位元組一個位元組的寫,寫的次數明顯很多, 效率就會變得很低。 如何提高效率呢? 緩衝輸出流的特點是: 在流裡維護了一個緩衝區(預設是8k),寫位元組時,先將位元組寫入緩衝區, 當緩衝區滿時,再一次性的將資料寫到檔案裡。 這樣就降低了寫的次數,因此提高了效率。 因此緩衝輸出流"缺失即時性",可以使用flush方法進行沖刷 常用構造器: BufferedOutputStream(OutputStream out): 建立一個指定位元組輸出流的緩衝流物件 BufferedOutputStream(OutputStream out,int size): 建立一個指定位元組輸出流的緩衝流物件,並設定指定(預設)緩衝區的大小 PS:當一次寫的位元組超出緩衝區大小,會出現溢位情況, 溢位的位元組會先寫出到檔案中 常用方法: void write(int b): 寫int資料的低八位,寫入緩衝區內 void write(byte[] b,int off,int len): 寫指定長度len的位元組陣列,寫入緩衝區 --BufferedInputStream:位元組緩衝輸入流 在讀取位元組時,也是一個位元組一個位元組的讀,次數多,效率低。 使用緩衝輸入流,內部維護了一個緩衝區,預設8k,先一次性將緩衝區裝滿 等待讀取. 當將緩衝區的資料讀完,緩衝區再次儲存後續資料。讀取的次數明顯降低效率高 構造器: BufferedInputStream(InputStream is); BufferedInputStream(InputStream is,int size); 常用方法: int read(byte[] bs): 讀取緩衝區裡的位元組儲存bs中, 當一次性讀取的位元組小於緩衝區,我們是從緩衝區裡讀資料。 此時,效率高 當一次性讀取的位元組超出緩衝區大小, 不使用緩衝區,直接從檔案裡讀。 int read(byte[] bs,int off,int len): 3.資料位元組流: 與緩衝流一樣,父類都是過濾位元組流( FilterOutputStream/FilterInputStream ) 這兩個類提供了幾個特殊的方法,可以直接寫基本資料型別.
資料輸出流:DataOutputStream 構造器: DataOutputStream(OutputStream os): 建立一個指定位元組輸出流的資料輸出流物件 常用方法: 除了提供寫一個位元組和寫一個位元組陣列的方法外,還提供瞭如下方法: writeByte(int b) writeShort(int s) writeInt(int i) writeLong(long l) writeFloat(float f) writeDouble(double d); writeChar(int c); writeBoolean(boolean b) writeUTF(String s); 資料輸入流:DataInputStream 構造器: 常用方法: 4.物件流: 有的時候,我們可能需要將記憶體中的物件持久化到硬碟上, 或者將硬碟中的物件資訊讀到記憶體中,這個時候我們需要使用物件輸入 輸出流。 序列化: 是物件轉換成一個位元組序列(位元組陣列)的過程,是一個寫操作 反序列化: 一個位元組序列轉換成物件的過程 ,是一個讀操作 實現序列化與反序列化的要求: (1)ObjectOutputStream: 構造器: ObjectOutputStream(OutputStream out): 建立一個指定位元組輸出流的物件輸出流物件。 常用方法: 除了提供了一些基本資料型別的寫方法外,還提供了
void writeObject(Object obj): 將記憶體中的物件持久化到硬碟上 (2)ObjectIntputStream 構造器: ObjectIntputStream(OutputStream out): 建立一個指定位元組輸入流的物件輸入流物件。 常用方法: 除了提供了一些基本資料型別的讀方法外,還提供了
Object readObject(): 從硬碟上讀取一個位元組序列,轉換成物件 ======================================================================= *Serializable:序列化介面 如果想將物件序列化,那麼物件的型別必須實現此介面。 此介面內什麼都沒有,只是一個序列化標識。
--serialVersionUID: 每個能序列化的物件,在被序列化時,系統會預設給此物件的類計算一個 序列化版本號。不同的平臺預設提供的序列化版本號多數情況下不會相同。 因此當我們反序列時,如果硬盤裡儲存的物件的版本號與當前設計的型別 的版本號不一致。會出現執行時異常: java.io.InvalidClassException,這種情況叫不相容問題。 如果我們想解決不相容問題。我們應該手動提供版本號。 儘可能的相同,這樣來解決不相容問題 另外一種情況: 序列化過後,可能會修改型別,如果使用系統預設提供的 版本號,在反序列時,會有異常,如果手動提供,不出現異常, 多出來的成員變數,以預設值的形式,賦值給反序列化回來的物件。 --transient: 成員變數的一個修飾詞,可以理解為瘦身(忽略)。 有的時候,在序列化物件時,我們不需要將物件的某些成員變數值 持久化到硬碟上(因為不重要),此時,我們可以在這些成員變數 前新增修飾詞transient(儲存時,進行減肥)