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
包中的輸入流:ProgressMonitorInputStreamProgressMonitorInputStream(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
,所以修改路徑為:
可成功打開gedit文件File file=new File("/usr/bin","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周學習總結