天天看點

20165230 2017-2018-2 《Java程式設計》第5周學習總結

20165230 2017-2018-2 《Java程式設計》第5周學習總結

教材學習内容總結

第七章 内部類與異常類

内部類與外嵌類

可以在類中定義另一個類,即内部類

包含内部類的類為内部類的外嵌類

  • 外嵌類的成員變量在内部類中有效,類體中可用内部類聲明對象
  • 内嵌類的類體中不可以聲明類變量和類方法,内部類中的方法可調用外嵌類的方法
  • 内部類僅供外嵌類使用
  • 内部類可為

    static

    内部類,即可用

    外嵌類.内部類

    的通路内部類,不可操作外嵌類中的執行個體成員變量

匿名類

  • 建立和子類有關的匿名類對象:
new 類(){
    匿名類類體
};
           
  • 建立和接口有關的匿名類對象
new 接口名(){
    實作接口的匿名類類體
};
           
  • 匿名類一定是内部類
  • 匿名類類體中不可聲明static成員變量和static方法
  • 匿名對象的引用常傳遞給一個參數

異常類

  • 使用

    throw

    抛出Exception子類的異常對象表示異常發生
  • try-catch

    語句
try {
    包含可能發生的異常語句//行為發生異常,就是方法調用
}
catch(Exception e){
···
}
           

catch參數中的異常類都是Exception子類,子類之間不能有父子關系

  • 自定義異常類

聲明方法時用

throws

關鍵字聲明要産生的若幹個異常,并具體給出産生異常的操作。

斷言

assert boolean邏輯判斷語句;
assert  boolean邏輯判斷語句:執行語句
           

當boolean為false時,程式從斷言處停止

第十章 輸入、輸出流

  • 所有輸入流都是抽象類

    InputStream

    Reader

    的子類
  • 所有輸出流都是抽象類

    OutputStream

    Writer

File類

建立File對象的三個構造方法
File(String filename);
File(String directoryPath,String filename);
File(File dir,String filename);
           
目錄

通過

File f = new File(name/path)

建立對象

  • f.mkdir();

    建立目錄
  • 列出目錄中的檔案:

1.

f.list()

String [] filelist = f.list();//用字元串形式
File [] filelist = f.listFiles();//用File對象形式
           

2.列出指定類型的檔案:

f.list(FilenameFilter obj)

  • 向接口FilenameFilter傳遞類的對象,參數obj可回調

    accept(File dir,String name

    方法,來檢驗檔案是否符合要求
建立删除與運作可執行檔案
f.creatNewFile();//建立
f.delete();//删除
Runtime ec = Runtime.getRuntime()//通過調用類方法建立對象
ec.exec(String command)//ec調用方法打開機器上的可執行檔案
           

檔案位元組輸入/輸出流

1.給出輸入/輸出流的源/目的地

File f = new File(name/path);

2.建立指向源/目的地的輸入/輸出流
  • 指向源
FileInputStream(String name);
FileInputStream(File file);
           
  • 指向目的地
FileOutputStream(String name);
FileOutputStream(File file);
           
FileOutputStream(String name,boolean append);
FileOutputStream(File file,boolean append);//當append的值為false時将重新整理所指向的檔案,否則将從檔案末尾開始寫入
           

必須在

try-catch

語句的try塊部分建立

3.使用輸入/輸出流讀取位元組
  • 輸入流
int read()//讀取單個位元組
int read(byte b[])//讀取b.length個位元組
int read(byte b [],int off,int len)//從第off個位置起讀取len個位元組
           
  • 輸出流
void write(int n)//寫入單個位元組
void write(byte b[])//寫入位元組數組
void write(byte b [],int off,int len)//從第off個位置起寫入len個位元組
           
4.關閉流

close()

方法

檔案字元輸入/輸出流

以字元為機關處理資料。

FileReader(String filename);
FileReader(File filename);
           
FileWriter(String filename);
FileWriter(File filename);
FileWriter(String name,boolean append);
FileWriter(File file,boolean)
           

緩沖流

BufferedReader

流和

BufferedWriter

,二者的源和目的地必須是字元輸入流和字元輸出流,

不能與目的地/源直接相連

構造方法
BufferedReader(Reader in);
BufferedWriter(Writer out);
           

向BufferedReader傳遞一個Reader子類的對象(将兩個流連接配接在一起),然後用readLine()方法即可按行讀取檔案

FileReader inOne = new FileReader("student.txt");
BufferedReader inTwo = BufferedReader(inOne);
String strLine = inTwo.readLine();
           
  • BufferWriter有寫入回行符的方法

    newLine()

随機流

  • RandomAccessFile類建立的流稱為随機流,用該類建立的流的指向既可為源,也可為目的地。
  • 構造方法:

    RandomAccessFile(String name,String mode)

mode取r(隻讀),取rw(可讀寫)

  • 指向檔案時,不重新整理檔案
  • seek(long a)

    可确定讀寫位置距離檔案開頭的位元組個數,可替換也可尾加

數組流

  • 位元組數組流
ByteArrayInputStream(byte[] buf);
ByteArrayInputStream(byte[] buf,int offset,int length);
           
ByteArrayOutputStream();
ByteArrayOutputStream(int size);
           
  • 字元數組流
CharArrayReader(char[] buf);
CharArrayReader(char[] buf,int offset,int length);
           
CharArrayWriter();
CharArrayWriter(int size);
           

資料流

  • 允許程式按着機器無關風格讀取java原始資料
DataInputStream(InputStream in)//建立輸入流指向由參數in指定的底層輸入流
DataOutputStream(OutputStream out)//建立輸出流指向由參數in指定的底層輸出流
           

對象流

ObjectOutputStream(OutputStream out)//該指向是一個輸出流對象
ObjectInputStream(InputStream in)//該指向是一個輸入流對象
           
  • 使用對象流寫入或讀入對象時,要保證對象和該對象的成員變量都是序列化的:類要實作

    serializable

    接口

序列化與對象克隆

  • 将對象寫入對象輸出流指向的目的地,然後将該目的地作為一個對象輸入流的源,即可克隆

使用Scanner解析檔案

  • 使用預設分割标記解析檔案
File file = new File("hello.java");
Scanner sc = new Scanner(file);
           
  • 使用正規表達式作為分割标記解析檔案
File file = new File("hello.java");
Scanner sc = new Scanner(file);
sc.useDelimiter(正規表達式);
           

檔案對話框

  • JFileChooser()

    建立初始不可見的有模式的檔案對話框
  • 調用兩個方法,使對話框可見
int ShowSaveDialog(Component a);
int ShowSaveDialog(Component a);
           
  • “确定”,“取消”或“關閉”按鈕,傳回常量
JFileChooser.APPROVE_OPTION
JFileChooser.CANCEL_OPTION
           
  • 檔案類型是使用者需要的類型
FileNameExtensionFilter filter = new FileNameExtensionFilter(7"圖像檔案","jpg","gif");//建立對象
chooser.setFileFilter(filter);//對話框調用方法來設定對話框預設打開或顯示的指定類型

           

帶進度條的輸入流

  • javax.swing

    包中的輸入流:ProgressMonitorInputStream
ProgressMonitorInputStream(Conmponent c,String s,InputStream)//進度條在參數c指定的元件的正前方顯示,若為null,在螢幕正前方顯示
           

檔案鎖

RandomAccessFile input = new RandomAccessFile("Example.java","rw");//建立指向檔案的流對象,讀寫屬性必須是rw
FileChannel channel=input.getChanner();//調用方法獲得連接配接到底層檔案的對象(信道)
FileLock lock = channel.tryLock();//檔案加鎖,加鎖後将禁止程式對檔案進行操作

lock.release();//釋放檔案鎖
           

教材學習中的問題和解決過程

  • 問題1:為什麼内部類的類體中不可以聲明類變量和類方法?
  • 問題1解決方案:通過網上查詢學習到以下知識
靜态變量是要占用記憶體的,在編譯時隻要是定義為靜态變量了,系統就會自動配置設定記憶體給他,而内部類是在宿主類編譯完編譯的,也就是說,必須有宿主類存在後才能有内部類,這也就和編譯時就為靜态變量配置設定記憶體産生了沖突,因為系統執行:運作宿主類->靜态變量記憶體配置設定->内部類,而此時内部類的靜态變量先于内部類生成,這顯然是不可能的,是以不能定義靜态變量!
  • 問題2:p289頁的代碼中,

    "新年快樂".getBytes()

    語句是什麼意思?
  • 問題2解決方案:涉及到第八章的内容,見p185頁知識點,String是一個類,其有許多方法,如此處即是調用getBytes()方法

public byte [] getBytes()

使用平台預設的字元編碼,将目前String對象的字元序列存放到位元組數組中,并傳回數組的引用。
  • 問題3:p292頁中代碼的類

    StringTokenizer

    是什麼意思?
  • 問題3解決方案:補充學習書上p191頁有關

    StringTokenizer

    類的知識。
  • 問題4:什麼是正規表達式
  • 問題4解決方案:通過查書得知

正規表達式是一個String對象的字元序列,該字元序列中含有具有特殊意義的字元,這些特殊字元稱作正規表達式中的元字元。

在正規表達式中可以用方括号括起若幹個字元來表示一個元字元,該元字元代表方括号中的任何一個字元

代碼調試中的問題和解決過程

  • 問題1:用idea導入代碼檔案時,提示編譯發生錯誤
  • 問題1解決方案:可強行編譯
  • 問題2:在p284頁中的代碼中,有以規定的名字結尾的方法,有沒有以規定改的名字開頭的方法?
  • 問題2解決方案:在網上查詢得知有startswith方法,用

    name.startswith(extendName)

    即可設定為傳回指定類型的檔案
  • 問題3:在調試example10_3時,由于例子中的可執行檔案在本虛拟機中沒有,是以無法運作
  • 問題3解決方案:嘗試打開虛拟機中已有的gedit編輯器,通過查詢得其目的地為

    /usr/bin

    ,是以修改路徑為:
File  file=new File("/usr/bin","gedit");
           

可成功打開gedit檔案

  • 問題4:example10_5運作出來的結果與書上不同,書上注釋為0,8,22.但在虛拟機中運作的得到是0,12,26
    20165230 2017-2018-2 《Java程式設計》第5周學習總結
  • 問題4解決方案:通過網上查詢得知linux下漢字是3個位元組
ubuntu預設使用UTF-8編碼,這種編碼的一漢字占用三個位元組
  • 問題5:運作虛拟機出現花屏現象
  • 問題5解決方案:通過網上查詢得知修改分辨率即可

代碼托管

20165230 2017-2018-2 《Java程式設計》第5周學習總結

其他(感悟、思考等,可選)

  • 本周學習任務較重,在學習第十章時,由于欠缺第八章知識,學起來比較吃力,對代碼的了解不夠深,遇到不懂的才往前翻對應的知識點邊學邊往補充,效率不高。應該

    遇到不懂的知識點後就将與之相關的知識呈體系化的補充上,再接着往後學,不然越到後面越吃力

學習進度條

代碼行數(新增/累積) 部落格量(新增/累積) 學習時間(新增/累積) 重要成長
目标 5000行 30篇 400小時
第一周 13/13 1/30 19/19
第二周 426/426 3/30 12/12
第三周 562/562 4/30 15/15
第四周 1552/1958 5/30 16/16
第五周 1123/3086 6/30 14/14

參考資料

  • 《Java2 實用教程(第五版)》學習指導
  • java成員内部類中為什麼不能定義靜态變量
  • 正規表達式
  • 詳解Linux系統中的usr目錄
  • Intellj IDEA 簡易教程
  • 使用JDB調試Java程式
  • linux系統的中文占幾個位元組