1. 程式人生 > >java io流字元亂碼問題

java io流字元亂碼問題

一箇中文佔兩個位元組,在字串中(一箇中文佔3個位元組(utf-8)或者2個位元組(GBK)),所以用位元組流讀入 寫出中文時會出現亂碼的情況。

解決辦法呢,就是將讀入的位元組流轉換成字串形式,這種方式不一定能夠能解決成功

 

先演示讀出問題:test/test0.txt的內容如下:

hello世界 世界

讀取test0.txt檔案

package IoCharctorTest01;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class Test01 {
    public static void main(String[] args){
        try (
                FileInputStream fis=new FileInputStream("test//test0.txt");
                ){
            int temp;
            String str="";
            byte [] bytes= new byte[3];
            while ((temp=fis.read(bytes))!=-1){
                System.out.println(new String(bytes,0,temp));
                //下面這種方式是通過字串拼接,將byte陣列轉換成字串,跟上面直接轉成字串效果無差別
                str =str +new String(bytes,0,temp);
               System.out.println(str );
               str="";
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }


    }
}
out:
hel
hel
lo�
lo�
���
���
�� 
�� 
世
世
界
界

為什麼會出現亂碼,分析,文字檔案中的中文字元是以兩個位元組的形式儲存,咱們設定byte陣列的時候設定的長度為3,在檔案中漢字佔用的是第6,7,8,9,,11,12,13,14這幾個位元組,那byte陣列,第3次讀取的時候正好讀到第6個位元組,讀了中文字元的一個位元組,所以顯示不出來,第3次讀取的時候讀了7,8,9,其中7是"世"的第二個位元組,8,9是界的兩個位元組,顯然這次也會亂碼,第4次讀取的時候,讀了10,11,12,其中10為空格,11,12是"世"的兩個位元組,這次可以正常轉換為字串,第5次讀取讀出13,14,這兩個位元組是"界"的兩個位元組,顯然也可以正常顯示,所以這種方式是有風險的,因為如果中文字元的位元組正好處於3,4時,必然亂碼

演示寫入問題:

上面已經說過字串中的漢字UTF-8編碼佔3個位元組,GBK編碼佔2個位元組

package IoCharctorTest01;



import java.io.BufferedOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;


public class Test03 {

    public static void main(String[] args) {
        try (FileOutputStream fis = new FileOutputStream("test\\test3.txt");) {
            String msg = "你好世界";

            //每次寫出4個位元組,因為一箇中文(utf-8)佔用3個位元組,所以導致亂碼
            fis.write(msg.getBytes(), 0, 4);
            //換行
            fis.write("\n".getBytes());
            //如果byte陣列正好能寫入對應於漢字的整的位元組數,不會出現亂碼
            fis.write("你好世界".getBytes(),0,6);
            fis.flush();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
out:
test3.txt內容為:
你�
你好

直接讀直接寫

以下程式碼經過測試,這種直接讀直接寫沒有問題 ,不會出現漢字亂碼情況,即便每次讀一個位元組寫一個位元組也不會出現亂碼

package IoCharctorTest01;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class Test02 {
    public static void main(String[] args){
        try (
                FileInputStream fis=new FileInputStream("test//test0.txt");
                FileOutputStream fos=new FileOutputStream("test//test2.txt");
        ){
            int temp;
            byte [] bytes= new byte[5];
            while ((temp=fis.read(bytes))!=-1){
                fos.write(bytes,0,temp);

            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

解決辦法:

用字元流解決讀寫問題,下篇部落格解決