Java使用FileReader.read()讀取文件時亂碼的兩個解決方案
Java使用FileReader.read()讀取文件時亂碼
public class FileReader_ {
public static void main(String[] args) {
}
@Test
public void m1() {
String filePath = "e:\\hello.txt";
FileReader fileReader = null;
try {
fileReader = new FileReader(filePath);
//循環(huán)讀取 使用read
while (fileReader.read()!=-1){
System.out.print((char) fileReader.read());//默認輸出的是int,因此需要轉(zhuǎn)化為char
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fileReader != null) {
fileReader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}以上代碼是有可能出現(xiàn)代碼輸出混亂的情況的,輸出效果如下:

可能會出現(xiàn)亂碼的問題
原因可能是文件編碼與程序讀取時使用的編碼不一致。
在創(chuàng)建FileReader對象時,沒有指定文件的編碼格式,因此默認使用的是系統(tǒng)默認的編碼格式。
如果文件中包含非系統(tǒng)默認編碼格式的字符,那么在讀取時就會出現(xiàn)亂碼。
解決過程
為了解決這個問題,可以在創(chuàng)建FileReader對象時指定文件的編碼格式。
例如,如果文件是使用UTF-8編碼的,可以這樣修改代碼:
public void m1() {
String filePath = "e:\\hello.txt";
FileReader fileReader = null;
int data = 0;
try {
// 指定字符編碼為UTF-8
fileReader = new FileReader(filePath, StandardCharsets.UTF_8);
//循環(huán)讀取 使用read
while ((data=fileReader.read())!=-1){
System.out.print((char) data); // 修改這里
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fileReader != null) {
fileReader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
上面這種方法,按理說也可以,但是我使用后發(fā)現(xiàn)報錯了,不能調(diào)用UTF-8,感興趣的小伙伴,自行嘗試 ~
在Java中,FileReader.read()方法返回的是讀取到的字節(jié)(int類型),而不是字符(char類型)。因此,需要使用強制類型轉(zhuǎn)換將其轉(zhuǎn)換為字符。
我們需要使用int類型的date來,接受fileReader.read(),當接受的數(shù)據(jù)不為空時,一直循環(huán)下去,直到接受到最后一個字符,然后每接受一個數(shù)據(jù),就強制轉(zhuǎn)換成 char 打印到控制臺,就不會出現(xiàn)亂碼的情況了
public class FileReader02_ {
public static void main(String[] args) {
}
@Test
public void m1() {
String filePath = "e:\\hello.txt";
FileReader fileReader = null;
int date=0;
try {
fileReader = new FileReader(filePath);
//循環(huán)讀取 使用read
while ((date=fileReader.read())!=-1){
System.out.print((char) date);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fileReader != null) {
fileReader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
控制臺打印輸出:

總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring中@PropertySource的使用方法和運行原理詳解
這篇文章主要介紹了Spring中@PropertySource的使用方法和運行原理詳解,PropertySource注解可以方便和靈活的向Spring的環(huán)境容器(org.springframework.core.env.Environment?Environment)中注入一些屬性,這些屬性可以在Bean中使用,需要的朋友可以參考下2023-11-11
Java實現(xiàn)的進制轉(zhuǎn)換工具類完整示例
這篇文章主要介紹了Java實現(xiàn)的進制轉(zhuǎn)換工具類,結(jié)合完整實例形式分析了Java實現(xiàn)二進制、十六進制、字符串、數(shù)組等相關(guān)轉(zhuǎn)換操作技巧,需要的朋友可以參考下2018-07-07
Spring Cloud Alibaba 本地調(diào)試介紹及方案設(shè)計
為了解決 本地調(diào)試 的問題,本文實現(xiàn)了一種簡單實用的策略,可以通過 Nacos 動態(tài)配置服務(wù)路由,還可以基于用戶,部門,組織等級別配置服務(wù)路由,實現(xiàn) 本地調(diào)試 的同時,實際上也實現(xiàn) 灰度發(fā)布,感興趣的朋友跟隨小編一起看看吧2021-07-07
解決Unable to start embedded container&nbs
這篇文章主要介紹了解決Unable to start embedded container SpringBoot啟動報錯問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07
Springboot實現(xiàn)自定義錯誤頁面的方法(錯誤處理機制)
這篇文章主要介紹了Springboot實現(xiàn)自定義錯誤頁面的方法(錯誤處理機制),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01

