Welcome to Yumao′s Blog.
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