1、
計算機中文件、數據底層都是基於二進制的。
計算機底層並沒有文本文件、圖片文件之分,它只是記錄着每個文件的二進制序列。
字符集:包含着字符和二進制序列之間的對應關系,一個字符對應一個二進制序列。
編碼(Encode):把人能看懂的明文轉換為計算機能理解二進制序列。
解碼(Decode):把計算機中的二進制序列轉換為人能看懂的明文。
亂碼:解碼方式與編碼方式不同,即編碼、解碼使用的字符集不一致。
Windows中文本文件的默認字符集是GBK。
2、
字節的文件輸出流可以指定寫入模式:
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); //指定編碼字符集
3、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[](字節序列):
- byte[] getBytes() //使用平台默認的字符集
- byte[] getBytes(String/Charset charset) //使用指定的字符集
返回編碼好的字節序列。
