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

Java SE2 Day02

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

流的功能擴展:(流的設計模式: 裝飾器模式, 靈活組合擴展功能(積木))
InputStream / OutputStream Byte流(字節流)
基本類型的IO(int long ) DataOutputStream/DataInputStream
文本類型(編碼) IO

    Writer / Reader 字符流, 每次處理一個字符
    InputStreamReader / OutputStreamWriter
    BufferedReader(readLine()) / PrintWriter(println())
    Scanner(Java 5)
    Console(Java 6)

    Scanner s = new Scanner(System.in);
    Random random = new Random();


  對象的 IO
  圖片的 IO


6 DataOutputStream 對基本的輸出流功能擴展, 提供了基本數據
  類型的輸出方法, 也就是基本類型是序列化方法
  writeInt() writeDouble()
  是過濾器
             DOS       FOS
  應用程序 -- 過濾器 -->輸出流--> 文件(Byte)
      writeInt(i)    write()   ff ff ff fd

7 DataInputStream 對基本的輸入流(InputStream)功能擴展,
  提供基本類型的輸入方法, 就是基本類型的反序列化
  DataInputStream 是過濾器, 只是功能擴展, 不能直接讀取文件
  readInt() readDouble() ...

                  FIS      DIS    dis.readInt()
 文件(Byte 序列)--輸入流--> 過濾器-->  應用程序
 [7f ff ff ff]   read()   readInt() 0x7fffffff

8 BufferedInputStream 和 BufferedOutputStream
  一般打開(in/out)文件, 都加上緩衝流, 提高IO性能
             DOS      BOS     FOS
  應用程序 -- 過濾器-->過濾器-->輸出流--> 文件(Byte)
      writeInt(i)    write() write(byte[]) ff ff ff fd
                      byte[]
  FileInputStream fis = new FileInputStream(file);
  BufferedInputStream bis = new BufferedInputStream(fis);
  DataInputStream in = new DataInputStream(bis);

  FileOutputStream fos = new FileOutputStream(file);
  BufferedOutputStream bos = new BufferedOutputStream(fos);
  DataOutputStream out = new DataOutputStream(bos);


1 字符串的序列化(文字的編碼方案)
 1) Stirng 字符串本質上是char[] 將char[] 轉換成byte序列
  就是字符串的編碼, 就是字符串的序列化問題



  char是16位無符號整數, 值是unicode編碼

  str.getBytes("GBK")

  new String(byte[], "gbk")

  byte 流


 2) utf-16be 編碼方案, 將16位char從中間切開為2個byte
  utf-16be 是 將unicode char[] 序列化為byte[] 的編碼方案
  能夠支持65535 個字符編碼, 英文浪費空間
  char[] = ['A','B','中']
  utf16be = [00, 41, 00, 42, 4e, 2d]

 3) UTF-8 編碼方案 採用變長編碼 1~N方案, 其中英文1個byte
  中文3個byte
  char[] = ['A','B','中']
  utf8 = [41 42 e4 b8 ad]

  utf-8: 是將unicode 編碼為 byte 序列的方案

  中:  4e2d = 0100111000101101

  e4 b8 ad = 11100100 10111000 10101101
             1110XXXX 10XXXXXX 10XXXXXX

   以0為開頭的是 英文!(0~127)
   110 表示連續2字節表示一個字符
   1110 表示連續3字節表示一個字符
   11110 表示連續4字節表示一個字符
   每個數據字節以 10開頭

 4) GBK 中國國標,支持20000+ 中日韓英, 英文1Byte編碼, 中2Byte
 與unicode不兼容, 需要碼錶轉換(散列表查詢)
 char[] = ['A','B','中'] //4e2d
 GBK(GB2312): {41,42,d6,d0},

5 認識文本和文本文件
 1) java的文本(char)是16位無符號整數, 是字符的unicode編碼
 2) 文件是byte by byte 的數據序列
 3) 文本文件是 文本char 序列按照某種(utf-8, utf-16be, gbk)
  方案序列化為byte, 的存儲結果.

6 字符流(Reader Writer)
 1) 字符的處理, 一次處理一個字符(unicode)
 2) 字符的底層仍然是基本的字節流
 3) 字符流的基本實現:
    InputStreamReader:完成byte流解析為char流, 按照編碼解析
    OutputStreamWriter:提供char流到byte流, 按照編碼處理

 4) 字符流的過濾器
  是字符讀寫的功能擴展, 極大的方便了文本的讀寫操作
   BufferedReader : readLine()
   PrintWriter: println()

 5)讀取一個文本文件:
	InputStream is = new FileInputStream("gbk.txt");
	Reader in = new InputStreamReader(is);
	BufferedReader reader = new BufferedReader(in);
  or
	BufferedReader in = new BufferedReader(
		new FileReader(filename));
 6) 寫出一個文本文件:
   PrintWriter out =
	 new PrintWtirer(new FileWriter(filename));
  or
     PrintWriter out =
	 new PrintWtirer(
	 	new OutputStreamWriter(
	 		new FileOutputStream(filename)));
 7) 系統的默認編碼 中文一般是GBK
   String encoding=System.getProperty("file.encoding");


作業:
  1) 熟練課堂全部代碼
  2) (選項) 實現文件切分方法和合併方法 參考: IOUtils.split()

預習:
   Timer 類, Java Socket編程, Swing

Code Package

课堂提纲教案

评论已关闭