20145302張薇《Java程式設計》第六週學習總結

20145302張薇發表於2016-04-10

20145302 《Java程式設計》第六週學習總結

教材學習內容總結

第十章

  • 串流設計的概念
    20145302張薇《Java程式設計》第六週學習總結
  1. 無論來源和目的地實體形式是什麼,只要取得InputStream和OutputStream例項後,就只是呼叫InputStream和OutputStream的相關方法。
  2. 如果要將資料寫入目的地,可以使用輸出串流。
  3. 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());
            }
        }
    }
}
  • 串流處理裝飾器
  1. BufferInputStream與BufferOutputStream會將資料儘量地讀取或者寫入到緩衝區,從而提高效率 -DataInputStream與DataOutputStream提供讀取寫入java基本型別的方法.
  2. ObjectInputStream與ObjectInputStream將資料讀入或寫出為物件.
  • Reader與Writer繼承架構
  1. FileReader、FileWriter可以對文件作讀取或寫入,預設會使用作業系統預設編碼。
  2. 抽象化了資料讀入和寫出的目的地,會將讀入的資料植入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 變數上宣告,表示該變數是不穩定的、易變的,並且不允許執行緒快取,保證單一變數的可見性。
  • 等待與通知
  • waitnotifynotifyAll
  • 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

  • 在託管程式碼時,出現下圖:
    20145302張薇《Java程式設計》第六週學習總結

  • 在這次之前我先弄過一次,但是他當時顯示我沒有公鑰,然而我上週弄得時候還好好的,我把git視窗關掉後再次輸入得出上圖。
    問題2
  • 託管未成功之後,所有的程式都不可以執行了,如下圖:
    20145302張薇《Java程式設計》第六週學習總結

問題3

  • 程式無法執行與除錯。執行裡面沒有該java檔名字,然後我想嘗試一下除錯程式,但是除錯時出現下圖(是一個無關檔案的錯誤):
    20145302張薇《Java程式設計》第六週學習總結

本週程式碼託管截圖

  • 由於託管出了問題,先給出檔案截圖
    20145302張薇《Java程式設計》第六週學習總結

20145302張薇《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 輸入輸出

參考資料

相關文章