一起來學(xué)習(xí)Java IO的轉(zhuǎn)化流
Java IO 轉(zhuǎn)化流
亂碼引起轉(zhuǎn)換流
讀取亂碼
讀取電腦磁盤上的Java.txt文件內(nèi)容,文件路徑: e:\Java\Java.txt,文件編碼格式為 utf-8 。

代碼示例:
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class TestDemo {
public static void main(String[] args) {
BufferedReader bufferedReader = null;
String filePath = "e:\\Java\\Java.txt";
try {
bufferedReader = new BufferedReader(new FileReader(filePath));//創(chuàng)建字符處理流對(duì)象
String s = bufferedReader.readLine();//讀取文件
System.out.println(s);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {//關(guān)閉處理流
try {
if (bufferedReader != null) {
bufferedReader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
運(yùn)行結(jié)果:將文件內(nèi)容讀取了出來。

因?yàn)槌绦蚰J(rèn)是以 utf-8 編碼讀取的,而此時(shí)Java.txt文件恰好是 utf-8 編碼,所以可以將內(nèi)容完整的讀取出來。如果改變Java.txt文件的編碼格式,讀取結(jié)果會(huì)怎樣呢?
修改Java.txt 文件的編碼格式為gbk,ANSI為國標(biāo)碼,根據(jù)電腦系統(tǒng)識(shí)別,當(dāng)前電腦系統(tǒng)為gbk編碼,所以將文件編碼修改為ANSI編碼即可。

再次讀取文件結(jié)果出現(xiàn)亂碼
因?yàn)槌绦蚰J(rèn)以u(píng)tf8編碼格式讀取文件,而此時(shí)文件編碼為gbk,所以讀取結(jié)果會(huì)產(chǎn)生亂碼。

如何解決這個(gè)問題?我們可以使用 轉(zhuǎn)換流 來指定輸入流的編碼格式
轉(zhuǎn)換流介紹
轉(zhuǎn)換流有 InputStreamReader 和 OutputStreamWriter兩種。
1. InputStreamReader:Reader的子類,可以將InputStream(字節(jié)流)轉(zhuǎn)換為Reader(字符流)
2. OutputStreamWriter:Writer的子類,可以將OutputStream(字節(jié)流)轉(zhuǎn)換為Writer (字符流)
3. 當(dāng)處理純文本數(shù)據(jù)時(shí),如果使用字符流效率更高,并且可以有效解決中文問題,建議將字節(jié)流轉(zhuǎn)換成字符流。
4. 可以在使用時(shí)指定編碼格式(比如utf8,gbk等)
InputStreamReader
InputStreamReader類繼承關(guān)系及構(gòu)造函數(shù)

InputStreamReader是Reader的一個(gè)子類,它其中的構(gòu)造函數(shù)InputStreamReader(InputStream,Charset)可以將一個(gè)字節(jié)輸入流轉(zhuǎn)換成字符輸入流,同時(shí)通過Charset屬性指定字符集編碼。
用轉(zhuǎn)換流InputStreamReader再次讀取上述示例中Java.txt文件,解決亂碼問題。
代碼示例:
import java.io.*;
public class InputStreamReaderTest {
public static void main(String[] args) throws IOException {
String filePath = "e:\\Java\\Java.txt";
FileInputStream fileInputStream = new FileInputStream(filePath);
//將字節(jié)輸入流,轉(zhuǎn)換為字符流 并指定編碼格式為 utf8
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "gbk");
//將字符流轉(zhuǎn)換為功能更加強(qiáng)大的字符處理流
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
//讀取內(nèi)容
String s = bufferedReader.readLine();
System.out.println(s);
//關(guān)閉流
bufferedReader.close();
}
}
運(yùn)行結(jié)果:
內(nèi)容讀取成功~~~

OutputStreamWriter
OutputStreamWriter類繼承關(guān)系及構(gòu)造函數(shù)

OutputStreamWriter是Writer的一個(gè)子類,它其中的構(gòu)造函數(shù)OutputStreamWriter(OutputStream,Charset)可以將一個(gè)字節(jié)輸出流轉(zhuǎn)換成字符輸出流,同時(shí)通過Charset屬性指定字符集編碼。
代碼示例:
編程將字節(jié)流 FileOutputStream 轉(zhuǎn)換成字符流OutputStreamWriter,并在電腦磁盤上文件hello.txt文件中指定gbk編碼格式寫入“你好,Java!”,文件路徑: e:\Java\hello.txt 。
import java.io.*;
public class OutputSteamWriterTest {
public static void main(String[] args) throws IOException {
String filePath = "e:\\Java\\hello.txt";
//將字節(jié)輸出流轉(zhuǎn)換為字符輸出流
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream(filePath), "gbk");
String content = "你好,Java!";
//將內(nèi)容寫進(jìn)文件
outputStreamWriter.write(content);
//關(guān)閉流
outputStreamWriter.close();
System.out.println("保存成功~~~");
}
}
運(yùn)行結(jié)果:
將內(nèi)容寫進(jìn)了hello.txt文件。

總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
SpringBoot整合RabbitMQ實(shí)現(xiàn)消息確認(rèn)機(jī)制
這篇文章主要介紹了SpringBoot整合RabbitMQ實(shí)現(xiàn)消息確認(rèn)機(jī)制,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08
Java Mybatis框架增刪查改與核心配置詳解流程與用法
MyBatis 是一款優(yōu)秀的持久層框架,它支持自定義 SQL、存儲(chǔ)過程以及高級(jí)映射。MyBatis 免除了幾乎所有的 JDBC 代碼以及設(shè)置參數(shù)和獲取結(jié)果集的工作。MyBatis 可以通過簡單的 XML 或注解來配置和映射原始類型、接口和 Java POJO為數(shù)據(jù)庫中的記錄2021-10-10
kafka分布式消息系統(tǒng)基本架構(gòu)及功能詳解
這篇文章主要為大家介紹了kafka分布式消息系統(tǒng)基本架構(gòu)及功能詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03

