Java转换流(InputStreamReader/OutputStreamWriter)
创始人
2024-05-19 11:45:44
0

在这里插入图片描述

文章目录

  • 概述
  • 为什么会有转换流?
  • InputStreamReader
  • OutputStreamWriter

概述

转换流是字节流到字符流的桥梁,在转换的过程中,可以指定编码。转换流也是一种处理流,它提供了字节流和字符流之间的转换。

在这里插入图片描述
转换流的两个类

  • InputStreamReader
  • OutputStreamWriter

为什么会有转换流?

众所周知,计算机中存储的数据都是二进制的数字,我们在电脑屏幕上看到的文字信息是将二进制转换之后显示的,两者之间存在编码与解码的过程,其互相转换必须遵循某种规则,即编码和解码都遵循同一种规则才能将文字信息正常显示,如果编码跟解码使用了不同的规则,就会出现乱码的情况。

在默认情况下,是按照UTF-8编码格式进行操作的

当我们将代码中的文件编码格式切换成其他编码格式,再次执行的时候就会出现乱码

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();}}}
}

文件中内容:hello你好
控制台输出:hello���

而转换流可以指定文件的编码方式,从而解决问题

InputStreamReader

InputStreamReader:Reader的子类,将字节输入流转换为字符输入流。是字节流通向字符流的桥梁。如果不指定字符集编码,该解码过程将使用平台默认的字符编码,如:GBK。
在这里插入图片描述

该类提供了4个构造方法,根据不同的场景进行选择操作

在这里插入图片描述

  • InputStream:表示字节输入流
  • charset:表示编码方式

传入一个InputStream对象,而且可以指定处理的编码方式

示例

字节流FileInputStream包装成(转换流)字符流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();//关闭外层流即可} catch (IOException e) {e.printStackTrace();}}}
}

此时文件本体的编码为ANSI,所以如果不按照GBK编码方式进行读取,则采用默认编码方式,会产生乱码

OutputStreamWriter

OutputStreamWriter:Writer的子类,将字节输出流转换为字符输出流。是字符流通向字节流的桥梁。如果不指定字符集编码,该解码过程将使用平台默认的字符编码,如:GBK。

在这里插入图片描述
该类提供了4个构造方法,根据不同的场景进行选择操作

在这里插入图片描述

  • OutputStream:表示字节输出流
  • Charset:表示编码格式

示例
写入数据到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文件的内容为UTF-8编码格式

当处理纯文本数据时,如果使用字符流效率更高,并且可以有效解决中文问题,所以建议将字节流转换为字符流,使用的时候可以指定相应的编码格式。(如:UTF-8,GBK,GB2312,ISO8859-1等)


相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...