20165230 2017-2018-2 《Java程式設計》第5周學習總結
教材學習内容總結
第七章 内部類與異常類
内部類與外嵌類
可以在類中定義另一個類,即内部類
包含内部類的類為内部類的外嵌類
- 外嵌類的成員變量在内部類中有效,類體中可用内部類聲明對象
- 内嵌類的類體中不可以聲明類變量和類方法,内部類中的方法可調用外嵌類的方法
- 内部類僅供外嵌類使用
- 内部類可為
内部類,即可用static
的通路内部類,不可操作外嵌類中的執行個體成員變量外嵌類.内部類
匿名類
- 建立和子類有關的匿名類對象:
new 類(){
匿名類類體
};
- 建立和接口有關的匿名類對象
new 接口名(){
實作接口的匿名類類體
};
- 匿名類一定是内部類
- 匿名類類體中不可聲明static成員變量和static方法
- 匿名對象的引用常傳遞給一個參數
異常類
- 使用
抛出Exception子類的異常對象表示異常發生throw
-
語句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);//對話框調用方法來設定對話框預設打開或顯示的指定類型
帶進度條的輸入流
-
包中的輸入流:ProgressMonitorInputStreamjavax.swing
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解決方案:通過網上查詢得知修改分辨率即可
代碼托管
其他(感悟、思考等,可選)
-
本周學習任務較重,在學習第十章時,由于欠缺第八章知識,學起來比較吃力,對代碼的了解不夠深,遇到不懂的才往前翻對應的知識點邊學邊往補充,效率不高。應該
遇到不懂的知識點後就将與之相關的知識呈體系化的補充上,再接着往後學,不然越到後面越吃力
學習進度條
代碼行數(新增/累積) | 部落格量(新增/累積) | 學習時間(新增/累積) | 重要成長 |
---|---|---|---|
目标 | 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系統的中文占幾個位元組