一起來學(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)建字符處理流對象 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 編碼讀取的,而此時Java.txt文件恰好是 utf-8 編碼,所以可以將內(nèi)容完整的讀取出來。如果改變Java.txt文件的編碼格式,讀取結(jié)果會怎樣呢?
修改Java.txt 文件的編碼格式為gbk,ANSI為國標(biāo)碼,根據(jù)電腦系統(tǒng)識別,當(dāng)前電腦系統(tǒng)為gbk編碼,所以將文件編碼修改為ANSI編碼即可。
再次讀取文件結(jié)果出現(xiàn)亂碼
因?yàn)槌绦蚰J(rèn)以utf8編碼格式讀取文件,而此時文件編碼為gbk,所以讀取結(jié)果會產(chǎn)生亂碼。
如何解決這個問題?我們可以使用 轉(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ù)時,如果使用字符流效率更高,并且可以有效解決中文問題,建議將字節(jié)流轉(zhuǎn)換成字符流。
4. 可以在使用時指定編碼格式(比如utf8,gbk等)
InputStreamReader
InputStreamReader
類繼承關(guān)系及構(gòu)造函數(shù)
InputStreamReader
是Reader的一個子類,它其中的構(gòu)造函數(shù)InputStreamReader(InputStream,Charset)
可以將一個字節(jié)輸入流轉(zhuǎn)換成字符輸入流,同時通過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òu)造函數(shù)OutputStreamWriter(OutputStream,Charset)
可以將一個字節(jié)輸出流轉(zhuǎn)換成字符輸出流,同時通過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ì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-08-08Java Mybatis框架增刪查改與核心配置詳解流程與用法
MyBatis 是一款優(yōu)秀的持久層框架,它支持自定義 SQL、存儲過程以及高級映射。MyBatis 免除了幾乎所有的 JDBC 代碼以及設(shè)置參數(shù)和獲取結(jié)果集的工作。MyBatis 可以通過簡單的 XML 或注解來配置和映射原始類型、接口和 Java POJO為數(shù)據(jù)庫中的記錄2021-10-10kafka分布式消息系統(tǒng)基本架構(gòu)及功能詳解
這篇文章主要為大家介紹了kafka分布式消息系統(tǒng)基本架構(gòu)及功能詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03