java學習(五)

學號 20189214 《Java程序設計》第五週學習總結

教材學習內容總結

輸入輸出

文件系統能夠包含3種類型的對象:文件、目錄和符號連接。
一個文件或路徑是一個java.io.File來表示的,java7以後有了java.nio.file.Path接口。html

  • FileSystem類
    • getDefult返回當前的文件系統。
    • getRootDirectories。它返回一個Iterable,用於遍歷根目錄。
    • getPath 能夠用來建立一個Path實例。
  • Path
    • getNameCount方法返回路徑中的名稱的數目
    • getName返回單個的名稱
    • getParent
    • getRoot
    • getFileName 返回當前Path的文件名

文件操做:java

  • 建立和刪除文件和目錄(creatFile,createDirectory)
  • 獲取目錄對象(DirectoryStream)
  • 複製和移動文件(copy,move)
  • 讀取和寫入文件
    • 二進制文件(readAllBytes,write)
    • 文本文件 (readAllLines,write)git

      Files類中的read和write方法只是適用於比較小的文件。比較大的文件,須要使用來代替。算法

  • 輸入/輸出流
    • Reader 從一個池中讀取字符的流
    • write 向一個池中寫入數據的流
    • InputStream 從一個池中讀取二進制數據的流
    • OutputStream 向一個池寫入二進制數據的流
  • 讀二進制數據
    • read()
    • read(byte[] data)
    • read( byte[] data ,int offset , int length)
    • avaliable (該方法返回了可以讀取而不會阻塞的字節數)
  • 寫二進制數據(OutputStream)
    • write()
    • write(byte[] data)
    • write( byte[] data ,int offset , int length)
  • 寫文本(outStreamWriter,printWriter)
    write和outputstream相似,只不過writer處理字符而不是字節。
    • write(int b )
    • write(char[] data)
    • write( char[] data ,int offset , int length)
    • write(String[] data)
    • write( String[] data ,int offset , int length)
    • printWriter(緩衝區BufferedWriter 對象)
  • 讀文本(Reader,inputStreamWriter,BufferedReader)
  • printStream記錄日誌
  • 將System.out重定向到一個文件來記錄日誌。還可使用setIn和setErr方法替代System對象中默認的in和out。
  • 隨機訪問文件
    • seekableByteChannel能夠執行讀和寫操做。
    • seekableByteChannerl須要使用byteBuffer類。api

      ByteBuffer提供了兩個put方法來寫一個字節
      還提供了putXXX,getXXX方法來讀寫緩存緩存

對象序列化

定義

  • 把對象轉換爲字節序列的過程稱爲對象的序列化。
  • 把字節序列恢復爲對象的過程稱爲對象的反序列化。安全

    java API

  • java.io.ObjectOutputStream表明對象輸出流,它的writeObject(Object obj)方法可對參數指定的obj對象進行序列化,把獲得的字節序列寫到一個目標輸出流中。
  • java.io.ObjectInputStream表明對象輸入流,它的readObject()方法從一個源輸入流中讀取字節序列,再把它們反序列化爲一個對象,並將其返回。
  • 只有實現了Serializable和Externalizable接口的類的對象才能被序列化。Externalizable接口繼承自 Serializable接口,實現Externalizable接口的類徹底由自身來控制序列化的行爲,而僅實現Serializable接口的類能夠 採用默認的序列化方式 。服務器

    用途

  1. 把對象的字節序列永久地保存到硬盤上,一般存放在一個文件中;
  2. 在網絡上傳送對象的字節序列。網絡

    常見場景

  3. Web服務器中的Session對象,當有 10萬用戶併發訪問,就有可能出現10萬個Session對象,內存可能吃不消,因而Web容器就會把一些seesion先序列化到硬盤中,等要用了,再把保存在硬盤中的對象還原到內存中。
  4. 當兩個進程在進行遠程通訊時,彼此能夠發送各類類型的數據。不管是何種類型的數據,都會以二進制序列的形式在網絡上傳送。發送方須要把這個Java對象轉換爲字節序列,才能在網絡上傳送;接收方則須要把字節序列再恢復爲Java對象。session

    線程與併發

    首先來區分一下線程與併發:

  • 多線程:指的是這個程序(一個進程)運行時產生了不止一個線程。使用java.lang.Thread類或者java.lang.Runnable接口編寫代碼來定義、實例化和啓動新線程。
  • 並行與併發:
    • 並行:多個cpu實例或者多臺機器同時執行一段處理邏輯,是真正的同時。
    • 併發:經過cpu調度算法,讓用戶看上去同時執行,實際上從cpu操做層面不是真正的同時。併發每每在場景中有公用的資源,那麼針對這個公用的資源每每產生瓶頸,咱們會用TPS或者QPS來反應這個系統的處理能力。

Thread狀態

  • new 線程尚未啓動的狀態
  • runable 線程正在執行的一種狀態
  • blocked 線程等待訪問對象的一個鎖的一種狀態
  • waiting 線程無限期等待另外一個線程執行一項操做的一種狀態
  • timed_waiting 線程在指定的時間內等待另外一個線程執行一項操做的一種狀態
  • terminated 線程已經推出的一種狀態

Java中線程的建立常見有如三種基本形式:
1.繼承Thread類,重寫該類的run()方法。
2.實現Runnable接口,並重寫該接口的run()方法,該run()方法一樣是線程執行體,建立Runnable實現類的實例,並以此實例做爲Thread類的target來建立Thread對象,該Thread對象纔是真正的線程對象。
3.使用Callable和Future接口建立線程。具體是建立Callable接口的實現類,並實現clall()方法。並使用FutureTask類來包裝Callable實現類的對象,且以此FutureTask對象做爲Thread對象的target來建立線程。

同步

  • synchronized, wait, notify 是任何對象都具備的同步工具。
  • wait/notify必須存在於synchronized塊中。而且,
  • 這三個關鍵字針對的是同一個監視器(某對象的監視器)。這意味着wait以後,其餘線程能夠進入同步塊執行。

synchronized的用法

  • 單獨使用:
    • 代碼塊:以下,在多線程環境下,synchronized塊中的方法獲取了lock實例的monitor,若是實例相同,那麼只有一個線程能執行該塊內容
    • 直接用於方法: 至關於上面代碼中用lock來鎖定的效果,實際獲取的是Thread1類的monitor。更進一步,若是修飾的是static方法,則鎖定該類全部實例。
public class Thread1 implements Runnable {
       Object lock;
       public void run() {  
       synchronized(lock){
     do something
       }
       }
    }
public class Thread1 implements Runnable {
       public synchronized void run() {  
    ..do something
       }
    }

併發
Callable
一個Callable是一個任務,它返回一個值,也可能拋出一個異常。
future模式:併發模式的一種,能夠有兩種形式,即無阻塞和阻塞,分別是isDone和get。其中Future對象用來存放該線程的返回值以及狀態

ExecutorService e = Executors.newFixedThreadPool(3);
 //submit方法有多重參數版本,及支持callable也可以支持runnable接口類型.
Future future = e.submit(new myCallable());
future.isDone() //return true,false 無阻塞
future.get() // return 返回值,阻塞直到該線程運行結束

高級多線程控制類

  1. ThreadLocal類
    • 用處:保存線程的獨立變量。對一個線程類(繼承自Thread)
      當使用ThreadLocal維護變量時,ThreadLocal爲每一個使用該變量的線程提供獨立的變量副本,因此每個線程均可以獨立地改變本身的副本,而不會影響其它線程所對應的副本。經常使用於用戶登陸控制,如記錄session信息。
    • 實現:每一個Thread都持有一個TreadLocalMap類型的變量(該類是一個輕量級的Map,功能與map同樣,區別是桶裏放的是entry而不是entry的鏈表。功能仍是一個map。)以自己爲key,以目標爲value。
      主要方法是get()和set(T a),set以後在map裏維護一個threadLocal -> a,get時將a返回。ThreadLocal是一個特殊的容器。
  2. 原子類(AtomicInteger、AtomicBoolean……)
  3. Lock類 
    • lock: 在java.util.concurrent包內。共有三個實現:

      ReentrantLock
      ReentrantReadWriteLock.ReadLock
      ReentrantReadWriteLock.WriteLock
    • ReentrantLock 可重入的意義在於持有鎖的線程能夠繼續持有,而且要釋放對等的次數後才真正釋放該鎖。

4.容器類
- BlockingQueue阻塞隊列。該類是java.util.concurrent包下的重要類,經過對Queue的學習能夠得知,這個queue是單向隊列,能夠在隊列頭添加元素和在隊尾刪除或取出元素。相似於一個管道,特別適用於先進先出策略的一些應用場景。普通的queue接口主要實現有PriorityQueue(優先隊列).
- ConcurrentHashMap高效的線程安全哈希map。請對比hashTable , concurrentHashMap, HashMap。

網絡

java.net.URL

URL 解析:

  • 協議爲(protocol):http
  • 主機爲(host:port):www.runoob.com
  • 端口號爲(port): 80 ,以上URL實例並未指定端口,由於 HTTP 協議默認的端口號爲 80。
  • 文件路徑爲(path):/index.html
  • 請求參數(query):language=cn
  • 定位位置(fragment):j2se,定位到網頁中 id 屬性爲 j2se 的 HTML 元素位置 。
import java.net.*;
    import java.io.*;
     
    public class URLDemo
    {
       public static void main(String [] args)
       {
      try
      {
        URL url = new URL("http://www.runoob.com/index.html?language=cn#j2se");
        System.out.println("URL 爲:" + url.toString());
        System.out.println("協議爲:" + url.getProtocol());
        System.out.println("驗證信息:" + url.getAuthority());
        System.out.println("文件名及請求參數:" + url.getFile());
        System.out.println("主機名:" + url.getHost());
        System.out.println("路徑:" + url.getPath());
        System.out.println("端口:" + url.getPort());
        System.out.println("默認端口:" + url.getDefaultPort());
        System.out.println("請求參數:" + url.getQuery());
        System.out.println("定位位置:" + url.getRef());
      }catch(IOException e)
      {
     e.printStackTrace();
      }
       }
    }

編譯運行結果以下:
URL 爲:http://www.runoob.com/index.html?language=cn#j2se
協議爲:http
驗證信息:www.runoob.com
文件名及請求參數:/index.html?language=cn
主機名:www.runoob.com
路徑:/index.html
端口:-1
默認端口:80
請求參數:language=cn
定位位置:j2se

URLConnections

URLConnection 方法列表以下:

  1. Object getContent() 檢索URL連接內容
  2. Object getContent(Class[] classes) 檢索URL連接內容
  3. String getContentEncoding() 返回頭部 content-encoding 字段值
  4. int getContentLength() 返回頭部 content-length字段值
  5. String getContentType() 返回頭部 content-type 字段值
  6. int getLastModified() 返回頭部 last-modified 字段值。
  7. long getExpiration() 返回頭部 expires 字段值。
  8. long getIfModifiedSince() 返回對象的 ifModifiedSince 字段值。
  9. public void setDoInput(boolean input)
    URL 鏈接可用於輸入和/或輸出。若是打算使用 URL 鏈接進行輸入,則將 DoInput 標誌設置爲 true;若是不打算使用,則設置爲 false。默認值爲 true。
  10. public void setDoOutput(boolean output)
    URL 鏈接可用於輸入和/或輸出。若是打算使用 URL 鏈接進行輸出,則將 DoOutput 標誌設置爲 true;若是不打算使用,則設置爲 false。默認值爲 false。
  11. public InputStream getInputStream() throws IOException 返回URL的輸入流,用於讀取資源
  12. public OutputStream getOutputStream() throws IOException 返回URL的輸出流, 用於寫入資源。
  13. public URL getURL() 返回 URLConnection 對象鏈接的URL

    socket

    客戶端請求與服務器進行鏈接的時候,根據服務器的域名或者IP地址,加上端口號,打開一個套接字。當服務器接受鏈接後,服務器和客戶端之間的通訊就像輸入輸出流同樣進行操做。

教材學習中遇到的問題和解決過程

  • 問題1:Lock和synchronized區別
  • 解決方案:lock更靈活,能夠自由定義多把鎖的枷鎖解鎖順序(synchronized要按照先加的後解順序)
    提供多種加鎖方案,lock 阻塞式, trylock 無阻塞式, lockInterruptily 可打斷式,還有trylock的帶超時時間版本。和Condition類的結合性能更高。

    代碼調試中的問題和解決過程

  • 問題1:密鑰保存在本地,不可通文件讀取來得到type[]
  • 問題1解決方案:私鑰不保存在本地。

代碼託管

https://gitee.com/shamBryce/JAVA

上週考試錯題總結

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

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 150/200 2/2 20/20
第二週 200/400 1/3 20/40
第三週 100/500 1/4 10/50
第四周 200/700 1/5 15/65
第五週 1400/2100 1/5 20/85
  • 計劃學習時間:15小時

  • 實際學習時間:20小時

參考資料

相關文章
相關標籤/搜索