1. 程式人生 > >File型別、javaBean規範、IO流、位元組流(4種)、Serializable序列化介面、transient

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(儲存時,進行減肥)