Java转换流(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等)
到此这篇关于Java转换流(InputStreamReader/OutputStreamWriter)的使用的文章就介绍到这了,更多相关Java转换流内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
java集合——Java中的equals和hashCode方法详解
本篇文章详细介绍了Java中的equals和hashCode方法详解,Object 类是所有类的父类,非常具有实用价值,需要的朋友可以参考下。2016-10-10Maven打包没有指定主类问题(xxx.jar中没有主清单属性)
这篇文章主要介绍了Maven打包没有指定主类问题(xxx.jar中没有主清单属性),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2023-04-04springboot1.X和2.X中如何解决Bean名字相同时覆盖
这篇文章主要介绍了springboot1.X和2.X中如何解决Bean名字相同时覆盖,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-03-03
最新评论