Java IO學習

一、核心類

java.io下的類

File 文件類、InputStream字節輸入流、OutputStream字節輸入流、Reader字符輸入流、Writer字符輸出流

接口

Closeable關閉流接口、Flushable刷新流接口、Serializable序列化接口

二、流分類

按方向:輸入流、輸出流;

按功能:節點流(直接操作數據源)、處理流也叫包裝流(間接操作數據源,對 流進行封裝,主要是簡化操作和提高性能);

按數據:字節流、字符流(底層基於字節流)。

三、文件編碼

編碼(encode):字符 -> 字節

解碼(decode):字節 ->字符 

UTF-8編碼英文是一個字節,中文是三個字節

四、亂碼產生的原因

1、亂碼產生的原因-字節數不夠

Demo(使用UTF-8編碼)

文件中的內容

@Test
    public void flushRead(){
        File file = new File("sources/123.txt");
        InputStream inputStream = null;
        try {
            inputStream = new FileInputStream(file);
            //批量讀取
            byte[] flush = new byte[3];
            int len;
            while ( (len = inputStream.read(flush)) != -1){
                String s = new String(flush,0,len);
                System.out.println(s);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if (null != inputStream){
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

每次讀取三個字節,運行結果如下

每次讀取三個字節

第一次,"q","w","e"三個英文,在UTF-8中每個英文佔一個字節,可以正常打印;

第二次,讀取的三個字節中 "r"佔一個字節,剩下2個字節都來自漢字"中","中"佔三個字節,這一次只讀取到了兩個字節,所以漢字"中"不能正常打印;

第三次,讀取的是漢字"中"的第三個字節,和漢字"文"的前兩個字節,打印出現亂碼;

第四次,讀取的是漢字"文"的第三個字節,打印出現亂碼

2、亂碼產生的原因-編碼和解碼使用的字符集不統一

Demo

 @Test
    public void decode() throws UnsupportedEncodingException {
        String s = "哈哈哈h";
        //編碼 默認使用工程的編碼方式UTF-8
        byte[] bytes = s.getBytes();
        //使用相同字符集 可以正常打印
        s = new String(bytes,0,bytes.length, StandardCharsets.UTF_8);
        System.out.println(s);
        //字符集不統一 出現亂碼
        s = new String(bytes,0,bytes.length-2,"gbk");
        System.out.println(s);
    }

運行結果

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章