先列幾個概念:
1.各種位元組io流(bytearrayoutputstream,fileoutputstream)都是繼承的inputstream,和outputstream。
2.記憶體中執行的各種物件的位元組編碼格式都是unicode
3.我們將字串(string)轉為位元組陣列(byte),或者將位元組陣列轉化為字串的時候,可以指定編碼格式,常見的編碼格式有utf-8,gbk,unicode,iso-8859等。
舉例:
string str ="";str.getbytes("utf-8")
byte buffer =newbyte[256];第一段**我們將字串編碼格式為utf-8的位元組陣列。bytearrayoutputstream out=newbytearrayoutputstream();
out.write(buffer,0, n)
out.tostring("gbk")
第二段**我們將位元組陣列寫入位元組流輸出物件中,並使用tostring轉化為字串,這個時候的轉換我們使用了gbk格式編碼。
如果我們不指定編碼格式,則jvm會使用系統預設的編碼格式進行編碼和解碼(android studio,eclipse等預設gbk、或者utf-8,可以修改配置成需要的編碼格式)。
我們知道,漢字在utf-8中是編碼為3個位元組的,而在gbk中是編碼成兩個位元組的。
如果編碼的時候,使用的utf-8,解碼使用gbk,就會出現亂碼。
舉個例子
字串 "廣州",被編碼成utf-8格式的話是6個位元組
e5 b9 bf e5 b7 9e
前三個位元組表示"廣",後三個位元組表示"州"
如果這個位元組陣列被gbk格式解碼後,就會每兩個位元組對應乙個漢字
e5 b9 --> 騫
bf e5--> 垮
b7 9e--> 窞
"廣州" 就變成了亂碼 "騫垮窞"
解決方法:
所以,我們在字串的編碼解碼過程中(主要是io通訊時候),最好是主動指定編碼的格式,設定成同意的格式,不然的話,如果編碼所在機器和解碼伺服器的預設編碼格式不一樣的話,就很容易出現亂碼。
IO流中資料傳遞的位元組流和字元流
第三種 與第二種基本一致,但資料用 byte陣列儲存 file file new file practice1.txt filereader fr null bufferedreader br null try catch filenotfoundexception e catch ioexcept...
File類中的常用方法 IO流中的位元組流
1.file類 檔案和目錄路徑名的抽象表示 2.絕對路徑 帶碟符的路徑.相對路徑 相對其他檔案或目錄的乙個路徑叫相對路徑.如果當前檔案或目錄相對其他碟符的的檔案或目錄來說,此時相對路徑 絕對路徑.如果當前檔案或目錄相對當前所有在的碟符的檔案或目錄來說,此時相對路徑 絕對路徑.根路徑 相當當前專案的路...
字元流中的編碼解碼問題
構造方法 方法名說明 inputstreamreader inputstream in 使用預設字元編碼建立inputstreamreader物件 inputstreamreader inputstream in,string chatset 使用指定的字元編碼建立inputstreamreader...