import java.io.*;

public class EndianTranslation {

    // 將InputStream讀出來的值，寫進OutputStream中
    public void writeTo(InputStream in, OutputStream out) throws IOException {
	int tmp;
	while ((tmp = in.read()) != -1) {
	    out.write(tmp);
	}
    }

    // 讀取檔案的資料，轉換Endian後印到螢幕上
    public void readFile(String fileName) throws IOException {
	InputStream bis = new BufferedInputStream(
		new EndianTranslationInputStream(new FileInputStream(fileName)));
	/*
	 * new FileInputStream: 讀取檔案 
	 * new EndianTranslationInputStream: 傳換Endian
	 * new BufferedInputStream: 利用Buffer加速讀取速度
	 */

	int tmp;
	while ((tmp = bis.read()) != -1) {
	    System.out.print(Integer.toHexString(tmp) + " ");
	}

	bis.close();
    }

    public static void main(String[] args) throws Exception {
	String s = "Arbalest唷呼"; // 測試用字串
	String cs = "UTF-16BE"; // 字串編碼
	EndianTranslation et = new EndianTranslation();
	InputStream in;
	byte[] b = s.getBytes(cs); // 用選定的編碼將字串解碼成Byte array

	// 印出原始字串的Byte array
	System.out.println("Original String: " + s);
	System.out.println("Original byte array (" + cs + "):");
	for (int i = 0; i < b.length; i++) {
	    System.out.print(Integer.toHexString(b[i] & 0xff) + " ");
	}
	System.out.println();

	// 將Byte array轉換Endian之後輸出到out.txt
	System.out.print("Byte array write to \"out.txt\" (Translate write) ... ");
	/*
	 * new ByteArrayInputStream: 由Byte array建立input stream
	 */
	in = new ByteArrayInputStream(b);
	
	/*
	 *  將OutputStream掛一個EndianOutputTranslationStream
	 *  這樣寫入時就會自動轉換Endian
	 */
	OutputStream out = new BufferedOutputStream(
		new EndianTranslationOutputStream(new FileOutputStream("out.txt")));
	
	/*
	 *  利用wrtieTo method將InputStream中的資料寫到OutputStream
	 *  記得我們的output stream有加上EndianTranslationOutputStream，所以會轉換Endian
	 */
	et.writeTo(in, out);
	// 養成好習慣用完的stream要close掉
	in.close();
	out.close();
	System.out.println("Done!");

	/*
	 *  開啟out.txt，將裡面的資料印出來
	 *  照理說應該是原本的Byte array轉換過後的結果
	 */
	System.out.println("Read file \"out.txt\" (Direct read):");
	in = new BufferedInputStream(new FileInputStream("out.txt"));
	int tmp;

	while ((tmp = in.read()) != -1) {
	    System.out.print(Integer.toHexString(tmp) + " ");
	}
	in.close();
	System.out.println();

	/*
	 * 利用readFile method開檔和印資料
	 * 記得readFile內的InputStream有加上EndianTranslationInputStream
	 * 因此印出來的結果是檔案資料轉換Endian的結果
	 * 也就是跟原始Byte array相同
	 */
	System.out.println("Read file \"out.txt\" (Translate read):");
	et.readFile("out.txt");
	System.out.println();
	
	/*
	 * 程式執行完以後，利用可選擇編碼的文字編輯器(Notepad++, Madedit...)開啟out.txt
	 * 用UTF-16LE編碼，應該可以看到原始字串而非亂碼
	 */

    }

}
