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)亂碼的情況。
在默認情況下,是按照UTF-8編碼格式進行操作的
當我們將代碼中的文件編碼格式切換成其他編碼格式,再次執(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é)流通向字符流的橋梁。如果不指定字符集編碼,該解碼過程將使用平臺默認的字符編碼,如:GBK。
該類提供了4個構(gòu)造方法,根據(jù)不同的場景進行選擇操作
InputStream:表示字節(jié)輸入流charset:表示編碼方式
傳入一個InputStream對象,而且可以指定處理的編碼方式
示例
字節(jié)流FileInputStream包裝成(轉(zhuǎn)換流)字符流InputStreamReader,對文件進行讀?。ò凑誙TF-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編碼方式進行讀取,則采用默認編碼方式,會產(chǎn)生亂碼
OutputStreamWriter
OutputStreamWriter:Writer的子類,將字節(jié)輸出流轉(zhuǎn)換為字符輸出流。是字符流通向字節(jié)流的橋梁。如果不指定字符集編碼,該解碼過程將使用平臺默認的字符編碼,如: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編碼格式
當處理純文本數(shù)據(jù)時,如果使用字符流效率更高,并且可以有效解決中文問題,所以建議將字節(jié)流轉(zhuǎn)換為字符流,使用的時候可以指定相應的編碼格式。(如: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)文章
java中VO PO DTO POJO BO DO對象的應用場景及使用
文章介紹了Java開發(fā)中常用的幾種對象類型及其應用場景,包括VO、PO、DTO、POJO、BO和DO等,并通過示例說明了它們在不同場景下的應用2025-01-01詳解Java編程規(guī)約(命名風格、常量定義、代碼格式)
這篇文章主要介紹了詳解Java編程規(guī)約(命名風格、常量定義、代碼格式),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-10-10springboot結(jié)合vue實現(xiàn)增刪改查及分頁查詢
本文主要介紹了springboot結(jié)合vue實現(xiàn)增刪改查及分頁查詢,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09

springcloud + mybatis + seate集成示例