一、編碼
計算機中文件、數據底層都是基於二進制的。spa
計算機底層並無文本文件、圖片文件之分,它只是記錄着每一個文件的二進制序列。code
字符集:包含着字符和二進制序列之間的對應關係,一個字符對應一個二進制序列。對象
編碼(Encode):把人能看懂的明文轉換爲計算機能理解二進制序列。blog
解碼(Decode):把計算機中的二進制序列轉換爲人能看懂的明文。圖片
亂碼:解碼方式與編碼方式不一樣,即編碼、解碼使用的字符集不一致。get
Windows中文本文件的默認字符集是GBK。it
二、class
字節的文件輸出流能夠指定寫入模式:亂碼
FileOutputStream fos=new FileOutputStream(String/File file);
FileOutputStream fos=new FileOutputStream(String/File file,boolean b); //第二個參數指定是不是追加模式,true——追加,false——覆蓋。
字符的文件流能夠指定字符集:
FileWriter fw=new FileWriter(String/File file);
FileReader fr=new FileReader(String/File file);
//指定字符集
FileWriter fw=new FileWriter(String/File file, String/Charset charset);
FileReader fr=new FileReader(String/File file, String/Charset charset);
//字符的文件輸出流還能夠指定寫入模式
FileWriter fw=new FileWriter(String/File file, boolean b ); //是不是追加模式
FileWriter fw=new FileWriter(String/File file, String/Charset charset, boolean b);
2個轉換流能夠指定編碼/解碼的字符集:
InputStreamReader isr=new InputStreamReader(InputStream is, String/Charset charset); //指定解碼字符集
OutputStreamWriter osr=new OutputStreamWriter(OutputStream os, String/Charset charset); //指定編碼字符集
三、NIO中的Charset類
1 //建立Charset對象,指定編碼/解碼用的字符集 2 Charset charset=Charset.forName("GBK"); 3 4 //建立編碼器 5 CharsetEncoder encoder=charset.newEncoder(); 6 //使用編碼器進行編碼。編碼是把字符序列轉換爲字節序列,參數只能是CharBuffer類型,返回值是ByteBuffer類型 7 ByteBuffer byteBuffer=encoder.encode(CharBuffer charBuffer); 8 9 //建立解碼器 10 CharsetDecoder decoder=charset.newDecoder(); 11 //使用解碼器進行解碼。解碼是把字節序列轉換爲字符序列,參數爲ByteBuffer類型,返回值是CharBuffer類型 12 CharBuffer charBuffer=decoder.decode(ByteBuffer byteBuffer);
也能夠不建立編碼器、解碼器:
1 //建立Charset對象,指定編碼/解碼用的字符集 2 Charset charset=Charset.forName("GBK"); 3 4 //編碼 5 ByteBuffer byteBuffer=charset.encode(String str); //此處可以使用String作參數 6 ByteBuffer byteBuffer=charset.encode(CharBuffer charBuffer); 7 8 //解碼 9 CharBuffer charBuffer=charset.decode(ByteBuffer byteBuffer);
更加簡單。
String類的對象還能夠使用如下方法將String(字符序列)編碼爲byte[](字節序列):
返回編碼好的字節序列。