20155318 2016-2017-2 《Java程序設計》第八學習總結
教材學習內容總結
學習目標
- 了解NIO
- 會使用Channel、Buffer與NIO2
- 會使用日志API、國際化
- 會使用正則表達式
- 了解JDK8增強功能
NIO與NIO2
- NIO(New IO)-from JDK1.4
- NIO用頻道銜接數據節點,在處理數據是,設定緩沖區容量,提供clear()、rewind()、flip()、compact()等方法。
- Channel: 銜接數據節點
- Buffer: 塊操作,直接子類都有一個allocate()靜態方法,容量大小可以用capacity()取得。
- NIO2 -from Java SE 7
- java.nio.file
- FileSystems
- Paths
- Files
- java.nio.file.atribute
- java.nio.file.spi
- 用FileSystemProvider取得所需的操作對象,完成相應操作。
- java.nio.file
通用API
日志API
java.util.logging
包提供了日志功能相關類與接口,使用日志的起點是logger類- Logger類的構造函數標示為protected
- 不是
java.util.logging
同包的類不能直接以new創建,必許使用Logger的靜態方法 - 無法使用構造方法生成Logger對象
- 通過getParent()取得父Logger實例,通過getLevel()取得設定的Level實例,默認取得的Logger實例,層級必須大於或等於
Logger.GLOBAL-LOGGER-NAME
名稱空間logger實例設定的Level.INFO,才可能輸出信息。Logger可通過setLevel()來設定Level實例創建:Logger logger = Logger.getLogger("cc.openhome.Main")
取得:Logger logger = Logger.getLogger("Main.class.getName")
Handler、Formatter與Filter
- Handler:輸出介質,標准API提供了幾個操作類:
- MemoryHandler不會格式化日志信息,信息會暫存於內存緩沖區,直至超過大小才將信息輸出至指定的目標Handler。
- StreamHandler可自行指定信息輸出時使用的OutputStream。
- ConsoleHandler創建時,會自動指定OutputStream為System.err。
- SocketHandler創建時可以指定主機位置與端口。
- addHandler()新增Handler實例,removeHandler()移除Handler實例
- Formatter: 格式化
- Filter: 過濾
國際化標准
- Localization 本地化;Internationalization(i18n)國際化
- ResourceBundle
- 靜態getBundle()方法取得一個ResourceBundle的實例,所給定的自變量名稱是信息文檔的主文件名,getBundle()會自動找到對應的.properties文檔,用getString()指定鍵來取得
- Locale
- 國際化的三個標准是地區(Locale)信息、資源包(Resource bundle)與基礎名稱(Base name)
正則表達式
- 用於字符、字符串格式比較,包含字面意義字符與元字符。
- 字面意義字符是指按照字面意義比較的字符
- 元字符是不按照字面意義比較的字符,在不同情境有不同意義的字符。
- String的split()方法會返回切割后各個子字符串組成的String數組
- {n},貪婪量詞,表示前面的量詞出現n次,會盡可能找出長度最長的符合文字。
貪婪量詞?
逐步量詞,找出長度最短的符合文字。貪婪量詞+
,獨吐量詞,沒有任何文字符合。- 邊界比較
- Pattern與Matcher
java.util.regex.Pattern
實例是規則表示式在JVM中的代表對象,Pattern的構造函數被標示為private,必須通過Pattern的靜態方法compile()來取得。- 用matcher()方法指定要比較的字符串,這會返回
java.util.regex.Matcher
實例,表示對指定字符串的比較。
JDK8 API增強功能
- String新增join()靜態方法可以指定每個字符串間以逗號分隔進行連接。
- Arrays上新增parallelPrefix()、parallelSetAll()與parallelSort()方法.
- 對數組進行管線化操作:
- 方法一是使用Arrays的asList()方法返回List,而后調用stream()方法取得Stream實例;
- 另一個方法是使用Arrays的stream()方法,可以指定數組后返回Stream實例。
- CharSequence上新增了chars()和codePoints()方法,都是返回intStream。
- Math在JDK8中也新增了不少數學運行相關API。
教材學習中的問題和解決過程
本周教材問題均為教學指導中的問題:
-
問題1:Logger/Level/Handler的關系
-
解決方案:Java日志緩存機制這篇博客對這個問題做了很好的解釋,總結如下:
-
Logger:日志結構的基本單元。Logger 是以樹形結構存儲在內存中的,根節點為
root.com.test
(如果存在)一定是com.test.demo
(如果存在)的父節點,即前綴匹配的已存在的 logger 一定是這個 logger 的父節點。這種父子關系的定義,可以為用戶提供更為自由的控制粒度。因為子節點中如果沒有定義處理規則,如級別 handler、formatter 等,那么默認就會使用父節點中的這些處理規則。 -
Level:JDK 中定義了 Off、Severe、Warning、Info、Config、Fine、Finer、Finest、All 九個日志級別,定義 Off 為日志最高等級,All 為最低等級。每條日志必須對應一個級別。級別的定義主要用來對日志的嚴重程度進行分類,同時可以用於控制日志是否輸出。
-
Handler:用來處理 LogRecord,默認 Handler 是可以連接成一個鏈狀,依次對 LogRecord 進行處理。
-
問題2:理解貪婪模式,非貪婪模式,獨占模式
-
解決方案:
-
- 貪婪匹配:正則表達式一般趨向於最大長度匹配。
- 非貪婪匹配:盡可能就少的匹配字符。
- 獨占模式:同貪婪一樣匹配最長正則表達式盡可能長地去匹配字符串,一旦匹配不成功就會結束匹配。
- 編程中如何區分兩種模式
- 默認是貪婪模式;在量詞后面直接加上一個問號?就是非貪婪模式。
代碼調試中的問題和解決過程
本周代碼調試問題均為教學指導中的問題:
- 問題1:p475 HandlerDemo.java: %h 從哪來的?還有什么其他模式字符串?
- 解決方案:是程序配置操作記錄文件,(可是我沒找到自己電腦上的)%h表示代碼根目錄,%t代表系統暫存目錄,%g自動為文檔編號
- 問題2:SplitDemo.java修改代碼,字符串改成csv,怎么分隔?
- 解決方案:修改代碼段如下:
for (String token:"csv".split("")){
System.out.println(token);
}
-
運行結果如下:
-
c語言實現思路:
s[]={我們輸入的字符串};
l=strlen(s);
for(i=0;i<l;i++){
if(s[i]="分割條件")
printf("\n");
else
printf("%s",s[i]);
}
- 問題3:p491 PatternMatcherDemo.java中
out.printf("%s find ", pattern.pattern())
的作用? - 解決方案:用find將前后分開
代碼托管
代碼行數統計
上周考試錯題總結
- 錯題1:下面哪些Linux 命令可以ASCII碼和16進制單字節方法輸出Hello.java的內容?
- A .od -b -tx1 Hello.java
- B .od -tcx1 Hello.java
- C .od -tc -tx1 Hello.java
- D .od -tbx1 Hello.java
- 正確答案: B C
- 解析:-b 是以八進制輸出
- 錯題2:JDK8中的Lambda表達式有以下好處:
- A .消除重復性
- B .提高性能
- C .提高安全性
- D .改善可讀性
- 正確答案: A D
- 分析:我沒注意是多選題,少選了A選項
- 錯題3:JDK8 中新時間API中,用於度量時間的類有()
- A .Instant
- B .Duration
- C .Period
- D .LocalDateTime
- 正確答案: B C
- 錯題4:A ________________ diagram helps us visualize the contents of and relationships among the classes of a program(___有助於我們查看程序中類的內容和它們之間的關系).
- A .class and object(類和對象)
- B .UML(UML類圖)
- C .object-oriented(面向對象)
- D .public
- E .private
- 正確答案: B
- 錯題5:__________________ parameters are the values that are used when calling a method(___參數是調用方法時傳給方法的值).
- A .formal(形式參數)
- B .actual(實際參數)
- C .useful(有用的參數)
- D .informal(非正式參數)
- E .none of the above(以上都不是)
- 正確答案: B
- 錯題6:An object can be thought of as a blueprint for a set of classes(對象被認為是類集合的藍圖).
- A .true
- B .false
- 解析:類可以被看作是一組對象的藍圖,而不是另一種方式。
- 錯題7:Which of the following objects could contain the information “eastern standard time”?(下面哪些類的對象會包含“東部標准時間”的信息)
- (Choose all that apply.)
- A .Instant
- B .LocalDate
- C .LocalDateTime
- D .LocalTime
- E .ZonedDateTime
- 正確答案: E
- 錯題8:What is the output of the following code?(下面代碼的運行結果是?)
LocalDate date = LocalDate.of(2018, Month.APRIL, 30);
date.plusDays(2);
date.plusYears(3);
System.out.println(date.getYear() + " "+
date.getMonth() + " "+ date.getDayOfMonth());
- A .2018 APRIL 2
- B .2018 APRIL 30
- C .2018 MAY 2
- D .2021 APRIL 2
- E .2021 APRIL 30
- F .2021 MAY 2
- G .A runtime exception is thrown.
- 正確答案: B
- 解析:日期開始為2018年4月30日。因為日期是不可變的,加上方法忽略返回值,結果不變。因此,選項B是正確的。
- 錯題8:What is the output of the following code?(下面代碼的運行結果是?)
LocalDate date = LocalDate.of(2018, Month.APRIL, 40);
System.out.println(date.getYear() + " " + date.getMonth()
+ " "+ date.getDayOfMonth());
- A .2018 APRIL 4
- B .2018 APRIL 30
- C .2018 MAY 10
- D .Another date
- E .The code does not compile.
- F .A runtime exception is thrown.
- 正確答案:F
- 解析:如果無效的日期值通過,則引發異常。沒有第四十天四月或任何其他月份
結對及互評
點評過的同學博客和代碼
- 本周結對學習情況
-
結對照片
-
結對學習內容
- 學習partner的代碼並作出點評
- 學習partner的博客和自己的博客做對比,找出不足
- 上周博客互評情況
其他(感悟、思考等,可選)
因為周末有其他事情,這周Java的學習時間提前了很多,不拖到周末學習反而感到心里輕松很多,果然周末就是不適合學習!但是發現很多前面的知識都還沒完全掌握,這將是未來學習需要努力的地方。
學習進度條
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一周 | 50/100 | 1/1 | 24/24 | 安裝學習Java的一系列軟件 |
第二周 | 250/300 | 1/2 | 30/54 | 了解Java的基本語法 |
第三周 | 552/852 | 1/3 | 16/60 | 了解Java是面向對象的語言 |
第四周 | 717/1569 | 1/4 | 10/70 | 了解Java繼承與接口 |
第五周 | 495/2064 | 1/5 | 6/76 | 了解異常處理,學會使用Collection收集對象 |
第六周 | 754/2818 | 1/6 | 6/82 | 了解串流和線程 |
第七周 | 679/3493 | 2/8 | 5/87 | 了解時間與日期,掌握Date和Calendar的一些用法 |
第八周 | 352/3845 | 1/9 | 8/95 | 了解並會使用通用API |
-
計划學習時間:6小時
-
實際學習時間:8小時