鍍金池/ 問答/Java  網(wǎng)絡(luò)安全/ javaIO之字符流是怎么讀取的?

javaIO之字符流是怎么讀取的?

最近在看io相關(guān)的知識,遇到一些小問題,以下有例子來說明問題:
比如:
12345 是一個十進(jìn)制數(shù)
根據(jù)ASCII碼找到是 :
二進(jìn)制 00110001 00110010 00110011 00110100 00110101
十進(jìn)制4950515253
十六進(jìn)制 0x310x320x330x340x35
文件以ansi編碼保存為:

clipboard.png

文件以unicode編碼保存:

clipboard.png

文件以utf-8編碼保存:

clipboard.png

問題一:為什么以unicode保存是這樣的(不是應(yīng)該3100 3200 3300 3400 3500就完了嗎),ff fe是個什么鬼呢?不是很明白。。。
問題二:以字節(jié)流讀取的話,如果讀取的是文本文件,應(yīng)該要設(shè)置編碼的吧?
問題三:字符流的話,是怎么讀取的,比如我現(xiàn)在文件現(xiàn)在以ansi保存,那里面應(yīng)該是 31 32 33 34 35。如果以字符流讀的話怎么讀呢?我看到網(wǎng)上說

clipboard.png

可我明明是以ansi保存的,哪來的unicode的呢?難道讀的時候會轉(zhuǎn)為unicode,然后再去讀???可以講下詳細(xì)的過程嗎??

謝謝各位大神!

回答
編輯回答
入她眼

問題一:
FFFE -> BOM -> Byte order mark 字節(jié)序標(biāo)識
字節(jié)順序標(biāo)記(英語:byte-order mark,BOM)是位于碼點(diǎn)U+FEFF的統(tǒng)一碼字符的名稱。當(dāng)以UTF-16或UTF-32來將UCS/統(tǒng)一碼字符所組成的字符串編碼時,這個字符被用來標(biāo)示其字節(jié)序。它常被用來當(dāng)做標(biāo)示文件是以UTF-8、UTF-16或UTF-32編碼的記號。

參見:
字節(jié)順序標(biāo)記

問題二:
是的。
問題三:
讀取時設(shè)置文件編碼,如:

InputStream input = new FileInputStream("data/text.txt");

    try(InputStreamReader inputStreamReader =
        new InputStreamReader(input,"ISO-8859-1")){
    
        int data = inputStreamReader.read();
        while(data != -1) {
            System.out.print((char) data);
            data = inputStreamReader.read();
        }
        
    }    
2018年2月4日 09:15