IO學習(十)了解解碼與編碼,用轉換流處理亂碼問題

2021-07-11 14:02:18 字數 1541 閱讀 2279

1.編碼與解碼

編碼:字元通過編碼字符集轉為二進位制

解碼:二進位制通過解碼字符集轉為字元

2.出現亂碼的兩種情況

第一,當解碼與編碼的字元不統一時,就會出現亂碼

第二,缺少位元組數,長度丟失,也會出現亂碼

/**

* 解碼與編碼字符集統一 否則亂碼

*/

// 解碼 byte-->char

string str = "中國";

// 編碼 char-->byte

byte data = str.getbytes();

// 編碼與解碼字符集統一為gbk

system.out.println(new string(data));

當解碼與編碼的字符集統一時,不會出現亂碼

輸出正常為 中國

//修改data編碼為「utf-8」

data = str.getbytes("utf-8");

system.out.println(new string(data));

當改變編碼字符集時,就會出現亂碼

輸出結果為:涓浗

byte data2 = "中國".getbytes("utf-8");

str = new string(data2, "utf-8");

system.out.println(str);

可以採用確定編碼解碼的字符集避免亂碼出現,如上都設定為「utf-8」

輸出結果正常 中國

/**

* 位元組數不完整,出現亂碼

*/string str2 = "中國";

byte data3 = str.getbytes();

system.out.println(new string(data, 0, 3));

因為乙個漢字佔兩個位元組,這裡需要4個位元組,而byte陣列長度為3 ,所以出現亂碼

輸出結果為 涓?

3.用轉換流解決檔案copy中亂碼問題

轉換流 位元組流轉為字元流

輸出流 :outputstreamwriter 編碼過程

輸入流 :inputstreamreader 解碼過程

使用轉換流的初衷是為了控制解碼字符集,而只有節點流按byte讀取,才可以設定字符集

所以用轉換流將位元組流轉換為字元流,從下面**可以看出建立這樣乙個物件是比較複雜的

1)file物件

2)fileinputstream物件 ,節點流

3)inputstreamreader物件,轉換流,同時設定字符集

4)bufferedreader物件,字元緩衝流

bufferedwriter思路一致

public class demo07 

br.close();

bw.close();

}}

拷貝結果正確無亂碼

檔案讀寫網路IO簡單了解,同步IO和非同步IO

在linux中,對檔案的讀寫其實就是io。與io有關的名詞 同步,非同步,阻塞,非阻塞,甚至是同步阻塞,同步非阻塞,非同步阻塞,非同步非阻塞。別急,下面有舉例 io分為兩大種,同步和非同步 同步io 阻塞io 非阻塞io io多路復用 包括select,poll,epoll三種 訊號驅動io 非同步...

java基礎十 IO字元流Writer

一 writer 用於寫入字元流的抽象類。子類必須實現的唯一方法是write char int,int flush 和close 然而,大多數子類將覆蓋這裡定義的一些方法,以便提供更高的效率,附加的功能或兩者。常用函式 已知子類 1.bufferedwriter 將文字寫入字元輸出流,緩衝字元,以提...

機器學習了解

機器學習的核心是 使用演算法解析資料,從中學習,然後對世界上的某件事情做出決定或 這意味著,與其顯式地編寫程式來執行某些任務,不如教計算機如何開發乙個演算法來完成任務。有三種主要型別的機器學習 監督學習 非監督學習和強化學習,所有這些都有其特定的優點和缺點。監督學習涉及一組標記資料。計算機可以使用特...