Welcome to Yumao′s Blog.
Hello JavaSE2 Day03
, 2012年03月20日 , Java Language , 评论 在〈Hello JavaSE2 Day03〉中留言功能已關閉 ,

Java SE Day03

====================

基本類型的序列化 writeInt() readInt()
照片的序列化 ImageIO.read() ImageIO.write()
1 字符串的序列化 編碼問題
println()
readLine()
2 對象的序列化
readObject()
writeObject()
常見文本文件讀取方式
對象的序列化
流的總結
廣義上: 數據轉換為byte 序列 都是序列化
int long 可以序列化 -> 拆分
String 可以序列化 –> 編碼
Image 可以序列化(.png) -> 圖片的壓縮格式
對象(屬性)可以序列化 對象編碼為 byte 序列


7 什麼是對象的序列化: 將Object轉換為byte序列,就是序列化,反之叫反序列化
  為什麼要序列化: 為了在byte流中存儲對象
 如何序列化: 使用writeObject(Object)/readObject()
 1) 序列化流, 是過濾流
    ObjectOutputStream writeObject(Object) 序列化對象
    ObjectInputStream readObject() 對象的反序列化
 2) 序列化接口: 對象必須實現"序列化接口"才能進行 "序列化"
   否則出現不能序列化的異常!
 3) JavaBean 規範, 必須實現Serializable接口
   Java API中的類大多是Java Bean, 基本都實現了Serializable
 序列化的應用:
8 淺層複製與深層複製
 1) Java的默認複製規則是淺層複製, 性能好, 隔離性差
   淺層複製現象, 只複製第一層對象
 2) 利用序列化實現深層複製

.Java IO 總結
 1)是一種數據操作模型: 把任何數據都作為Byte的有序集合看待
  逐一處理的方式方式叫做流.
  Java 流模型, 是byte by byte 是數據集合
   data   :  41 42 00 00 ff ff d6 d0
   index  :   0  1  2  3  4  5  6  7  8
   pointer:   ^

  RandomAccessFile 只能操作文件, 只能處理基本類型

  節點流: 流開始和結束的地方
  過濾器: 基本流的功能擴展

  字節流: 每次處理一個byte
  字符流: 每次出來一個char

  ObjectInputStream in = new ObjectInputStream(
  	 new CipherInputStream(
	  new FileInputStream(file)));
  Object obj = in.readObject();

  CipherInputStream in = new CipherInputStream(
	  new FileInputStream(file));
  img = ImageIO.read(in);

  裝飾器模式: 流的API是按照裝飾器模式設計的

 InputStream 最基本的輸入流操作模型, 是抽象類(read()是沒有實現的)
  |-- FileInputStream 實現了在文件上讀取的方法 read(), 節點流
  |-- ByteArrayInputStream 實現了在數組裡讀取的方法 read()
  |-- FilterInputStream 過濾流,包裝在一個基本流外部,提供功能擴展
  |    |-- DataInputStream 為基本流擴展了基本數據類型讀取
  |    |    readInt() readDouble()...方法的底層是read()
  |    |-- BufferedInputStream 為基本流提供緩衝處理
  |    |-- CipherInputStream 解密輸入流, 知道就行
  |    |-- ZipInputStream 解壓輸入流, 知道就行
  |-- ObjectInputStream 對象輸入流, 也是過濾器

 OutputStream 最基本的輸出流操作模型,是抽象類(write()是沒有實現的)
  |-- FileOutputStream 實現了在文件上寫出的方法 write(), 節點流
  |-- ByteArrayOutputStream 在變長數組上實現了write() 方法
  |-- FilterOutputStream
  |    |-- DataOutputStream 基本類型輸出
  |    |
  |    |-- BufferedOutputStream 緩衝輸出
  |    |-- CipherOutputStream 加密輸出
  |    |-- ZipOutputStream 壓縮輸出
  |-- ObjectOutputStream 對象輸出流

 字符流, 每次處理一個字符

 Reader 抽象類, 定義了抽象方法read(), 每次讀取一個字符
  |-- InputStreamReader 也是過濾器, 將byte序列解碼為char序列
  |      底層也是依賴基本的byte輸入流
  |-- BufferedReader (Scanner) 是字符流過濾器,
  |     有常用的文本讀取方法readLine()
  |-- FileReader 底層是 FileInputSream + InputStreamReader
  |     不能指定讀取文件的字符編碼

 Writer 抽象類, 定義抽象方法write() 每次寫出一個字符
  |-- OutputStreamWriter 也是過濾器, 將char序列編碼為byte序列
  |      底層也是依賴基本的byte輸出流
  |-- PrintWriter 是過濾器, 提供了常用方法println()
  |      非常常見的文本處理方法
  |-- FileWriter = OutputStreamWriter + FileOutputStream
  |      不能指定文本輸出編碼, 不好用!


11 Java 多線程編程
 1) 程序: 指令+數據的byte序列, 如: qq.exe
 2) 進程: 正在運行的程序, 是程序動態的執行過程(運行於主存儲器)
 3) 線程: 在進程內部, 並發運程的過程(方法)
 4) 並發: 進程是並發運行的, OS將時間劃分為很多時間片段, 儘可能
   均勻分配給正在運行的程序, 微觀上進程走走停停, 宏觀上都在運行
   這種都運行的現象叫: 並發, 但是不是絕對意義上的"同時"
12 Java 創建一個線程
 1)Thread 類: 線程包含一個可以運行的過程(方法)
   Thread 類中包含方法 run
 2) 創建一個具體線程, 需要繼承於Thread類
 3) 覆蓋run 方法(就是更新運行過程), 實現用戶自己的過程
 4) 創建線程實例(一個線程)
 5) 使用線程實例的start() 方法啟動線程, 啟動以後線程會儘快的
   去並發執行run()
13 線程的狀態
  1 new 新建
  2 Runnable 可以運行(就緒)
  3 Running 運行(正在運行)
  4 Block 阻塞  掛起
  5 Dead 死亡
14 線程狀態管理:
  1)讓出CPU
  Thread.yield() 當前線程讓出處理器(離開Running),
    使當前線程進入Runnable等待
  2)休眠
   Thread.sleep(times) 使當前線程從 Running 放棄處理器
    進入Block狀態, 休眠times毫秒, 再返回到Runnable
    如果其他線程打斷當前線程的Block(sleep), 就會發生
    InterruptedException.

15 線程的常用屬性
 1)線程的優先級 (資源緊張時候, 儘可能優先)
  t3.setPriority(Thread.MAX_PRIORITY);
  默認有10 優先級, 優先級高的線程獲得執行的機會多. 機會
  的多少不能通過代碼干預.
  默認的優先級是 5

 2)後台線程(守護線程, 精靈線程)
  t1.setDaemon(true);
  Java進程的結束: 當前所有前台線程都結束時, Java進程結束
  後台線程, 不管是否結束, 都被停掉! 因為並發的現象, 後台線程
  不會立即結束!

 3) 線程名字
    getName()

 4) 當前線程
   Thread main = Thread.currentThread();

16 兩種方式創建線程
  1)繼承Thread類
    a 繼承Thread類, 覆蓋run()方法, 提供並發運程的過程
    b 創建這個類的實例
    c 使用start() 方法啟動線程
  2)實現Runnable接口
    a 實現Runnable接口, 實現run()方法, 提供並發運程的過程
    b 創建這個類的實例, 用這個實例作為Thread構造器參數
      創建Thread類.
    c 使用start() 方法啟動線程

    class Foo implements Runnable{
    	public void run(){
    		//....
    	}
    }
    Thread t = new Thread(new Foo());
    t.start();

  3)使用 內部類/匿名類 創建線程
17 Sleep 的打斷喚醒
  1) Thread.sleep(times) 使當前線程從 Running 放棄處理器
    進入Block狀態, 休眠times毫秒, 再返回到Runnable
  2)一個線程可以提前喚醒另外一個sleep Block的線程
  	interrupt() 打斷/中斷
  3) 被喚醒線程出現 中斷異常

13) 異步, 同步
  1) 異步: 並發, 各干自己的: 如: 一群人上卡車
  2) 同步: 步調一致的處理, 如: 一群人上公交車, "倫敦制"

14) 案例異步寫文件

  1) 一個線程負責將控制台信息讀取到內存緩衝區(集合)
    如果控制台輸入quit 將結束輸入. 中斷寫出線程

  2) 一個線程負責將緩衝區中的信息寫到硬盤文件
    每次檢查緩衝區是否有數據, 如果有就寫出, 直到空為止
    如果沒有數據就休眠5秒
    寫出線程是後台線程, 可以自動結束

  3) 緩衝區採用隊列(FIFO)的工作方式

1 兩種方式創建線程
  1)繼承Thread類
    a 繼承Thread類, 覆蓋run()方法, 提供並發運程的過程
    b 創建這個類的實例
    c 使用start() 方法啟動線程
  2)實現Runnable接口
    a 實現Runnable接口, 實現run()方法, 提供並發運程的過程
    b 創建這個類的實例, 用這個實例作為Thread構造器參數
      創建Thread類.
    c 使用start() 方法啟動線程

    class Foo implements Runnable{
    	public void run(){
    		//....
    	}
    }
    Thread t = new Thread(new Foo());
    t.start();

  3)使用 內部類/匿名類 創建線程

Code Package

课堂提纲教案

关键字:, , , , , ,

评论已关闭