Java轉(zhuǎn)換流(InputStreamReader/OutputStreamWriter)的使用
概述
轉(zhuǎn)換流是字節(jié)流到字符流的橋梁,在轉(zhuǎn)換的過程中,可以指定編碼。轉(zhuǎn)換流也是一種處理流,它提供了字節(jié)流和字符流之間的轉(zhuǎn)換。

轉(zhuǎn)換流的兩個類
- InputStreamReader
- OutputStreamWriter
為什么會有轉(zhuǎn)換流?
眾所周知,計算機中存儲的數(shù)據(jù)都是二進制的數(shù)字,我們在電腦屏幕上看到的文字信息是將二進制轉(zhuǎn)換之后顯示的,兩者之間存在編碼與解碼的過程,其互相轉(zhuǎn)換必須遵循某種規(guī)則,即編碼和解碼都遵循同一種規(guī)則才能將文字信息正常顯示,如果編碼跟解碼使用了不同的規(guī)則,就會出現(xiàn)亂碼的情況。
在默認(rèn)情況下,是按照UTF-8編碼格式進行操作的
當(dāng)我們將代碼中的文件編碼格式切換成其他編碼格式,再次執(zhí)行的時候就會出現(xiàn)亂碼
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class CodeQuestion {
public static void main(String[] args) {
//讀取E盤下a.txt文件
String filePath = "E:\\a.txt";
BufferedReader bufferedReader = null;
try {
bufferedReader = new BufferedReader(new FileReader(filePath));
String file = bufferedReader.readLine();
System.out.println(file);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
文件中內(nèi)容:hello你好
控制臺輸出:hello???
而轉(zhuǎn)換流可以指定文件的編碼方式,從而解決問題
InputStreamReader
InputStreamReader:Reader的子類,將字節(jié)輸入流轉(zhuǎn)換為字符輸入流。是字節(jié)流通向字符流的橋梁。如果不指定字符集編碼,該解碼過程將使用平臺默認(rèn)的字符編碼,如:GBK。

該類提供了4個構(gòu)造方法,根據(jù)不同的場景進行選擇操作

InputStream:表示字節(jié)輸入流charset:表示編碼方式
傳入一個InputStream對象,而且可以指定處理的編碼方式
示例
字節(jié)流FileInputStream包裝成(轉(zhuǎn)換流)字符流InputStreamReader,對文件進行讀取(按照UTF-8格式),進而包裝成BufferedReader
讀取E盤下的文件(read方法)
import java.io.*;
public class InputStreamReader_ {
public static void main(String[] args) {
String filePath = "E:\\a.txt";
BufferedReader bufferedReader = null;
try {
InputStreamReader gbk = new InputStreamReader(new FileInputStream(filePath), "GBK");
bufferedReader = new BufferedReader(gbk);
//下面為第二種寫法,通常使用第二種
//bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(filePath),"GBK"));
String s;
while ((s = bufferedReader.readLine()) != null) {
System.out.println(s);
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bufferedReader.close();//關(guān)閉外層流即可
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
此時文件本體的編碼為ANSI,所以如果不按照GBK編碼方式進行讀取,則采用默認(rèn)編碼方式,會產(chǎn)生亂碼
OutputStreamWriter
OutputStreamWriter:Writer的子類,將字節(jié)輸出流轉(zhuǎn)換為字符輸出流。是字符流通向字節(jié)流的橋梁。如果不指定字符集編碼,該解碼過程將使用平臺默認(rèn)的字符編碼,如:GBK。

該類提供了4個構(gòu)造方法,根據(jù)不同的場景進行選擇操作

- OutputStream:表示字節(jié)輸出流
- Charset:表示編碼格式
示例
寫入數(shù)據(jù)到E盤下的文件(write方法)
import java.io.*;
public class OutputStreamWriter_ {
public static void main(String[] args) {
String filePath = "E:\\test.txt";
OutputStreamWriter utf8 = null;
try {
utf8 = new OutputStreamWriter(new FileOutputStream(filePath), "UTF8");
try {
utf8.write("hello世界");
} catch (IOException e) {
e.printStackTrace();
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
try {
utf8.close();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("按照utf-8保存文件成功");
}
}
}
此時E盤下的test.txt文件的內(nèi)容為UTF-8編碼格式
當(dāng)處理純文本數(shù)據(jù)時,如果使用字符流效率更高,并且可以有效解決中文問題,所以建議將字節(jié)流轉(zhuǎn)換為字符流,使用的時候可以指定相應(yīng)的編碼格式。(如:UTF-8,GBK,GB2312,ISO8859-1等)
到此這篇關(guān)于Java轉(zhuǎn)換流(InputStreamReader/OutputStreamWriter)的使用的文章就介紹到這了,更多相關(guān)Java轉(zhuǎn)換流內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot實現(xiàn)調(diào)用自定義的應(yīng)用程序((最新推薦)
這篇文章主要介紹了SpringBoot實現(xiàn)調(diào)用自定義的應(yīng)用程序的相關(guān)知識,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-06-06
Java 中的CharArrayReader 介紹_動力節(jié)點Java學(xué)院整理
CharArrayReader 是字符數(shù)組輸入流。它和ByteArrayInputStream類似,只不過ByteArrayInputStream是字節(jié)數(shù)組輸入流,而CharArray是字符數(shù)組輸入流。CharArrayReader 是用于讀取字符數(shù)組,它繼承于Reader2017-05-05
Springboot應(yīng)用中過濾器如何修改response的header和body內(nèi)容
這篇文章主要介紹了Springboot應(yīng)用中過濾器如何修改response的header和body內(nèi)容問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07

