20145302 《Java程式設計》第六週學習總結
教材學習內容總結
第十章
- 串流設計的概念
- 無論來源和目的地實體形式是什麼,只要取得InputStream和OutputStream例項後,就只是呼叫InputStream和OutputStream的相關方法。
- 如果要將資料寫入目的地,可以使用輸出串流。
dump()
方法
import java.io.*;
public class IO {
public static void dump(InputStream src, OutputStream dest)
throws IOException {
try (InputStream input = src; OutputStream output = dest) {
byte[] data = new byte[1024];
int length;
while ((length = input.read(data)) != -1) {
output.write(data, 0, length);
}
}
}
}
- 將某個文件讀入並另存為另一個文件:
import java.io.*;
public class Copy {
public static void main(String[] args) throws IOException {
IO.dump(
new FileInputStream(args[0]),
new FileOutputStream(args[1])
);
}
}
- 從HTTP伺服器讀取某個網頁,並另存為文件:
import java.io.*;
import java.net.URL;
public class Download {
public static void main(String[] args) throws IOException {
URL url = new URL(args[0]);
InputStream src = url.openStream();
OutputStream dest = new FileOutputStream(args[1]);
IO.dump(src, dest);
}
}
- 串流繼承結構
- 將標準輸入指定為
FileInputStream
,可以讀取指定文件並顯示在文字模式:
import java.io.*;
import java.util.*;
public class StandardIn {
public static void main(String[] args) throws IOException {
System.setIn(new FileInputStream(args[0]));
try (Scanner file = new Scanner(System.in)) {
while (file.hasNextLine()) {
System.out.println(file.nextLine());
}
}
}
}
- 串流處理裝飾器
- BufferInputStream與BufferOutputStream會將資料儘量地讀取或者寫入到緩衝區,從而提高效率 -DataInputStream與DataOutputStream提供讀取寫入java基本型別的方法.
- ObjectInputStream與ObjectInputStream將資料讀入或寫出為物件.
- Reader與Writer繼承架構
- FileReader、FileWriter可以對文件作讀取或寫入,預設會使用作業系統預設編碼。
- 抽象化了資料讀入和寫出的目的地,會將讀入的資料植入char陣列中.
- 字元處理裝飾器可以使用BufferReader和BufferWriter將資料進行緩衝,增加讀取寫入效率。
第十一章 - 執行緒介紹
- 通過建立Thread例項來執行Runnable例項定義的run方法可以實現多個執行緒。
- Thread和Runnable
- 繼承Thread類也可以進行多個程式,但沒有Runnable的彈性好,運用Lambda表示式也可以簡化程式。
- 執行緒生命週期
- Daemon:在所有的非Daemon執行緒結束時,JVM就會自動終止
- sleep、wait阻斷等都會讓執行緒進入blocked狀態,運用多執行緒,避免cpu空閒下來,是改進效能的方式之一。
- ThreadGroup
- 用來管理群組中的執行緒,enumerate可以取得群組中的所有執行緒,activecount()用來取得執行緒的數量
- synchronized和volatile
- 被表示為synchronized的區塊會被監控(monitor),需要先取得指定物件鎖定後才能執行,執行緒因synchronized區塊而進入blocked,在取得鎖定之後,會先回到runnable狀態,不正確地使用synchronized可能會造成效能低落或者死結。
- volatile 變數上宣告,表示該變數是不穩定的、易變的,並且不允許執行緒快取,保證單一變數的可見性。
- 等待與通知
wait
、notify
、notifyAll
- Lock、ReadWriteLock與Condition
- 如果兩個方法都只是讀取物件狀態,並沒有更改物件狀態,只是讀取操作的話,允許多個執行緒並行會對讀取效率有所改善 ReadWriteLock介面就定義了讀取鎖定與寫入鎖定行為。
- 使用Executor
- Executor介面可以將Runnable的指定與實際如何執行分離.
- Collection
- CopyOnWriteArraySet操作set介面,使用於一個很少進行寫入操作,而使用迭代器頻繁的情境。
教材學習中的問題和解決過程
第十章課後練習
- AC BD AC BD A BC BD BD D ABD
第十一章課後練習 - A B B AB AB D B A B C
程式碼除錯中的問題和解決過程
問題1
在託管程式碼時,出現下圖:
- 在這次之前我先弄過一次,但是他當時顯示我沒有公鑰,然而我上週弄得時候還好好的,我把git視窗關掉後再次輸入得出上圖。
問題2 託管未成功之後,所有的程式都不可以執行了,如下圖:
問題3
- 程式無法執行與除錯。執行裡面沒有該java檔名字,然後我想嘗試一下除錯程式,但是除錯時出現下圖(是一個無關檔案的錯誤):
本週程式碼託管截圖
- 由於託管出了問題,先給出檔案截圖
其他(感悟、思考等,可選)
- 這周好累,作業如潮水般襲來,得挺住啊
學習進度條
程式碼行數(新增/累積) | 部落格量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 1500行 | 15篇 | 400小時 | |
第一週 | 10/10 | 2/2 | 10/10 | 基礎知識 |
第二週 | 50/60 | 1/3 | 35/35 | 語法知識 |
第三週 | 100/160 | 1/4 | 25/60 | 瞭解物件 |
第四周 | 150/310 | 1/5 | 30/90 | 物件導向 |
第五週 | 390/700 | 1/6 | 30/120 | 處理異常 |
第六週 | 300/1000 | 2/8 | 30/150 | 輸入輸出 |