要讀取的文件
文件編碼格式爲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以後,打印漢字亂碼
解決
問題一(編譯完成後,運行顯示找不到主類)
去掉上述測試代碼的package行,然後重新編譯運行(找不到主類的具體原因與類的路徑有關,除了去掉package還有別的解決辦法)
// package com.accu.ecs.liu;
問題二(打印漢字亂碼)
原因是在cmd運行javac命令和java命令的時候,沒有指定使用的編碼,
javac -encoding UTF-8 Test1.java
java -Dfile.encoding=utf-8 Test1