FileInputStream中文亂碼,read()和read(byte[] b)區別

要讀取的文件

文件編碼格式爲UTF-8

編碼

測試代碼只涉及運行類中的main方法,所以沒設置tomcat控制檯亂碼相關(有關控制檯亂碼不同情況處理方式,https://www.cnblogs.com/vhua/p/idea_1.html)

讀取代碼

使用read()方法

read()方法爲按字節讀取內容,漢字大於一個字節,控制檯會亂碼

package com.accu.ecs.liu;

import java.io.*;

public class Test1 {
    private String name = "ss";


    public static void main(String[] args) throws IOException {
        InputStream io = null;
        try {
            File file1 = new File("C:\\Users\\YF-JGJ\\Desktop\\cubic安裝.txt");
            byte[] bt = new byte[100];
            io = new FileInputStream(file1);
            int len = io.read();
            // int len = io.read(bt);
            while (len > 0) {
                System.out.print((char) len);
                len = io.read();
                // System.out.println(new String(bt));
                // len = io.read(bt);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            io.close();
        }

    }
}

 結果:

 使用read(byte[] b)方法

read(byte[] b)方法爲從該輸入流讀取最多b.length字節的數據到字節數組

b.length最好指定爲文件大小,代碼中的100是我隨便寫的

package com.accu.ecs.liu;

import java.io.*;

public class Test1 {
    private String name = "ss";


    public static void main(String[] args) throws IOException {
        InputStream io = null;
        try {
            File file1 = new File("C:\\Users\\YF-JGJ\\Desktop\\cubic安裝.txt");
            byte[] bt = new byte[100];
            io = new FileInputStream(file1);
            //int len = io.read();
            int len = io.read(bt);
            while (len > 0) {
                //System.out.print((char) len);
                //len = io.read();
                System.out.println(new String(bt));
                len = io.read(bt);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            io.close();
        }

    }
}

 結果:

總結

FileInputStream的read方法,不傳遞byte數組做參數,則按字節讀取數據,漢字的字節數大於1,導致打印到控制檯亂碼,傳遞byte數組做參數以後,通過String的構造方法,可以正常讀取數組中的字節,並轉爲中文展示。


順帶測試了直接使用cmd編譯運行的時候的效果

問題點:

  1. 編譯完成後,運行顯示找不到主類
  2. 解決問題1以後,打印漢字亂碼

解決

問題一(編譯完成後,運行顯示找不到主類)

去掉上述測試代碼的package行,然後重新編譯運行(找不到主類的具體原因與類的路徑有關,除了去掉package還有別的解決辦法)

// package com.accu.ecs.liu;

問題二(打印漢字亂碼)

原因是在cmd運行javac命令和java命令的時候,沒有指定使用的編碼,

javac -encoding UTF-8 Test1.java

java -Dfile.encoding=utf-8 Test1

 

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