1. 程式人生 > >20165230 2017-2018-2 《Java程序設計》第5周學習總結

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

應該 類方法 第五版 smon 第七章 txt 關鍵字 string dial

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時,程序從斷言處停止

第十章 輸入、輸出流

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

    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
    技術分享圖片

  • 問題4解決方案:通過網上查詢得知linux下漢字是3個字節

    ubuntu默認使用UTF-8編碼,這種編碼的一漢字占用三個字節

  • 問題5:運行虛擬機出現花屏現象
    技術分享圖片
  • 問題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系統的中文占幾個字節

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