Download presentation
Presentation is loading. Please wait.
1
Lab2 Tutorial CS340100, 2010
2
Lab2 Brief Introduction 學習重點 – 如何實作 FilterInputStream, FilterOutputStream – 使用 Java IO (ex: 存取檔案 ) 工作項目 – 實作 EndianTranslationInputStream class – 實作 EndianTranslationOutputStream class – 實作 writeTo(InputStream in, OutputStream out) – 實作 readFile(String fileName) – 上述 Class 與 method 的使用範例
3
Endian? 16-bit(2-byte) 的數字儲存在記憶體中的方式 – ex: 43981 10 = ABCD 16 Memory Address Data 01 CDAB Memory Address Data 01 ABCD Little-endian Big-endian
4
2-byte Endian Translate Translator ABCD1A2B3C4D 012345 ABCD1A2B3C4D 012345
5
ByteArrayInputStream For Example … ABCD1A2B3C4D 012345 InputStream in = in.read() returns AB in.read() returns CD in.read() returns 1A …
6
EndianTranslationInputStream Endian Translate Filter… ByteArrayInputStream ABCD1A2B3C4D 012345 InputStream in = in.read() returns AB in.read() returns CD in.read() returns … 2B
7
EndianTranslationInputStream public class EndianTranslationInputStream extends FilterInputStream
8
Methods int read() EndianTranslationInputStream InputStream in = int read() in.read() x 2 => Buffer; Buffer( ) return Buffer[1]; EndianTranslationInputStream InputStream in = int read() in.read() x 2 => Buffer; Buffer( ) return Buffer[1]; ByteArrayInputStream ABCD 1A2B3C4D 012345 ABCD
9
Methods int read() – 從自己內部的 InputStream 讀兩個 byte – 交換順序後 return 出去 – 記得 read() 回傳 -1 代表 Stream 結尾
10
int read(byte[] b, int off, int len) – 一次讀 len 個 byte ,並且放到 b[off] … b[len-1] – 回傳總共讀了幾個 byte EndianTranslationInputStream InputStream in = int read(byte[] b, int off, int len) this.read() x len … EndianTranslationInputStream InputStream in = int read(byte[] b, int off, int len) this.read() x len … ByteArrayInputStream 1A2B3C4D 012345 ABCD
11
Trace Source Code java.io.FilterInputStream java.io.FilterOutputStream java.io.BufferedInputStream
12
Endian Translation Class
13
writeTo Method void writeTo(InputStream i, OutputStream o) – 將 InputStream 裡的東西,丟到 OutputStream – 簡單來說 … o.write(i.read()); writeTo 檔案 ByteArray Socket ( 網路 ) … 檔案 ByteArray Socket ( 網路 ) …
14
readFile Method void readFile(String fileName) – InputStream in = – System.out.print(Interger.toHexString(in.read() )); – until in.read() == -1 EndianTranslationInputStream FileInputStream -------- -------- -------- “input.txt”
15
UTF-16BE UTF-16LE UTF-16BE – 一個字用 16-bit 來表示,以 Big-endian 方式儲存 UTF-16LE – 一個字用 16-bit 來表示,以 Big-endian 方式儲存
16
UTF-16BE UTF-16LE “ARX”.getBytes(“UTF-16BE”) “ARX”.getBytes(“UTF-16LE”) 00520058 012345 0041 AR X 00520058 012345 0041 AR X
17
Main method example 1. 由一個字串建立 Byte Array (UTF-16BE) 2. 將這個 ByteArray 轉換 Endian 後存入 ”out.txt” – 利用 writeTo() 3. 直接讀取 ”out.txt” 00520058 012345 0041 00520058 012345 0041
18
Main method example 4. 利用 readFile() 讀取 ”out.txt” 5. 用文字編輯器打開 ”out.txt” – 選擇編碼: UTF-16LE 00520058 012345 0041
19
EndianTranslationInputStream BufferedInputStream Try this … EndianTranslationInputStream ByteArrayInputStream BufferedInputStream EndianTranslationInputStream ByteArrayInputStream
20
Deadline 5/7 23:59 要請大家來跟我們聊聊你 寫的程式 答不出問題作業會扣分
21
Q1: 有規定檔案輸入輸出的編碼嗎? A: No, 只要能展示出你寫的 Filter, writeTo, readFile 正確運作即可 Q2: 萬一 InputStream 是單數個 Byte ? A: 你可以多補一個 byte(0) ,或是丟 Exception Q3: Demo 時會故意用 read(byte[] b, ….) ? A: 我應該不會直接去用,但是我會掛一個 BufferedInputStream 在外面,這樣就會用到該 method
22
Q4: 怎麼讀一個 byte ? A: InputStream in = new ByteArrayInputStream ( “ToyBox”.getBytes(“UTF-16BE”)); System.out.println(in.read()); Q5: 二退期限過了嗎? Yoshi: 5/7 二退 deadline ^_< 讀一個 Byte 由 byte array 建立 input stream
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.