20155222 2016-2017-2 《Java程序設計》第8周學習總結
教材學習內容總結
Java NIO(New IO)是一個可以替代標準Java IO API的IO API(從Java 1.4開始),Java NIO提供了與標準IO不同的IO工作方式。
Java NIO: Channels and Buffers(通道和緩沖區)
標準的IO基于字節流和字符流進行操作的,而NIO是基于通道(Channel)和緩沖區(Buffer)進行操作,數據總是從通道讀取到緩沖區中,或者從緩沖區寫入到通道中。JDK 1.4中引入的日志API,能夠捕獲很多錯誤信息,比如:設置錯誤、性能瓶頸、安全破壞、程序或平臺小問題等。這些API提供的日志非常適用于各種不同使用者的分析,包括:外出服務工程師,軟件開發人員,參與客戶管理和維護的系統管理員。
教材學習中的問題和解決過程
- IO與NIO有何區別?
面向流與面向緩沖
Java NIO和IO之間第一個最大的區別是,IO是面向流的,NIO是面向緩沖區的。 Java IO面向流意味著每次從流中讀一個或多個字節,直至讀取所有字節,它們沒有被緩存在任何地方。此外,它不能前后移動流中的數據。如果需要前后移動從流中讀取的數據,需要先將它緩存到一個緩沖區。 Java NIO的緩沖導向方法略有不同。數據讀取到一個它稍后處理的緩沖區,需要時可在緩沖區中前后移動。這就增加了處理過程中的靈活性。但是,還需要檢查是否該緩沖區中包含所有您需要處理的數據。而且,需確保當更多的數據讀入緩沖區時,不要覆蓋緩沖區里尚未處理的數據。
阻塞與非阻塞IO
Java IO的各種流是阻塞的。這意味著,當一個線程調用read() 或 write()時,該線程被阻塞,直到有一些數據被讀取,或數據完全寫入。該線程在此期間不能再干任何事情了。 Java NIO的非阻塞模式,使一個線程從某通道發送請求讀取數據,但是它僅能得到目前可用的數據,如果目前沒有數據可用時,就什么都不會獲取。而不是保持線程阻塞,所以直至數據變的可以讀取之前,該線程可以繼續做其他的事情。 非阻塞寫也是如此。一個線程請求寫入一些數據到某通道,但不需要等待它完全寫入,這個線程同時可以去做別的事情。 線程通常將非阻塞IO的空閑時間用于在其它通道上執行IO操作,所以一個單獨的線程現在可以管理多個輸入和輸出通道(channel)。
代碼調試中的問題和解決過程
-如何使用NIO讀取數據。
import java.io.*; import java.nio.*; import java.nio.channels.*; public class Program { static public void main( String args[] ) throws Exception { FileInputStream fin = new FileInputStream("c:\\test.txt"); // 獲取通道 FileChannel fc = fin.getChannel(); // 創建緩沖區 ByteBuffer buffer = ByteBuffer.allocate(1024); // 讀取數據到緩沖區 fc.read(buffer); buffer.flip(); while (buffer.remaining()>0) { byte b = buffer.get(); System.out.print(((char)b)); } fin.close(); }
}
代碼托管
上周考試錯題總結
- 下面哪些Linux 命令可以ASCII碼和16進制單字節方法輸出Hello.java的內容?
od -tcx1 Hello.java
od -tc -tx1 Hello.java
- JDK8中定義的通用函數接口,從行為上分為()類型:
Consumer
Function
Predicate
Supplier
When applied to instance variables, the ________________ visibility modifier enforces encapsulation(當應用到實例變量時,____可見性修飾符強制執行封裝).:
private
__________________ parameters are the values that are used when calling a method(___參數是調用方法時傳給方法的值).:
actual(實際參數)
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 runtime exception is thrown.
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());2018 APRIL 30
Given the following, which answers can correctly fill in the blank? (Choose all that apply.)針對下面的代碼,()中應填入哪個選項?
LocalDate date = LocalDate.now();
LocalTime time = LocalTime.now();
LocalDateTime dateTime = LocalDateTime.now();
ZoneId zoneId = ZoneId.systemDefault();
ZonedDateTime zonedDateTime = ZonedDateTime.of(dateTime, zoneId);
long epochSeconds = 0;
Instant instant = ( );zonedDateTime.toInstant()
學習進度條
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一周 | 9/9 | 3/6 | 10/10 | |
第二周 | 40/49 | 1/7 | 5/15 | |
第三周 | 49/99 | 1/8 | 10/25 | |
第四周 | 202/301 | 1/9 | 15/40 | |
第五周 | 170/471 | 1/10 | 5/45 | |
第六周 | 115/520 | 1/11 | 5/50 | |
第七周 | 18/538 | 1/12 | 5/55 | |
第八周 | 28/545 | 1/13 | 5/60 |
嘗試一下記錄「計劃學習時間」和「實際學習時間」,到期末看看能不能改進自己的計劃能力。這個工作學習中很重要,也很有用。
耗時估計的公式
:Y=X+X/N ,Y=X-X/N,訓練次數多了,X、Y就接近了。
參考:軟件工程軟件的估計為什么這么難,軟件工程 估計方法
計劃學習時間:20小時
實際學習時間:5小時
改進情況:
有空多看看現代軟件工程 課件 軟件工程師能力自我評價表
參考資料
Java學習筆記(第8版)
- 《Java學習筆記(第8版)》學習指導
...