Java转换流(InputStreamReader/OutputStreamWriter)的使用

 更新时间:2023年01月28日 10:52:08   作者:墨辰JC  
本文主要介绍了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转换流内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot实现调用自定义的应用程序((最新推荐)

    SpringBoot实现调用自定义的应用程序((最新推荐)

    这篇文章主要介绍了SpringBoot实现调用自定义的应用程序的相关知识,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-06-06
  • Mybatis拦截器的实现介绍

    Mybatis拦截器的实现介绍

    MyBatis提供了一种插件(plugin)的功能,虽然叫做插件,但其实这是拦截器功能。MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。下面通过本文给大家介绍Mybatis拦截器知识,感兴趣的朋友一起看看吧
    2016-10-10
  • java中BigDecimal进行加减乘除的基本用法

    java中BigDecimal进行加减乘除的基本用法

    大家应该对于不需要任何准确计算精度的数字可以直接使用float或double运算,但是如果需要精确计算的结果,则必须使用BigDecimal类,而且使用BigDecimal类也可以进行大数的操作。下面这篇文章就给大家介绍介绍关于java中BigDecimal进行加减乘除的基本用法。
    2016-12-12
  • Java 中的CharArrayReader 介绍_动力节点Java学院整理

    Java 中的CharArrayReader 介绍_动力节点Java学院整理

    CharArrayReader 是字符数组输入流。它和ByteArrayInputStream类似,只不过ByteArrayInputStream是字节数组输入流,而CharArray是字符数组输入流。CharArrayReader 是用于读取字符数组,它继承于Reader
    2017-05-05
  • Springboot应用中过滤器如何修改response的header和body内容

    Springboot应用中过滤器如何修改response的header和body内容

    这篇文章主要介绍了Springboot应用中过滤器如何修改response的header和body内容问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • java使用回溯法求解数独示例

    java使用回溯法求解数独示例

    这篇文章主要介绍了java使用回溯法求解数独示例,大家参考使用吧
    2014-01-01
  • Java程序包不存在的3种解决方法总结

    Java程序包不存在的3种解决方法总结

    包存在的,但是启动项目的时候提示包不存在,所以解决下,这篇文章主要给大家介绍了关于Java程序包不存在的3种解决方法,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • java中的可变参数使用方法

    java中的可变参数使用方法

    这篇文章主要介绍了java中的可变参数使用方法的相关资料,需要的朋友可以参考下
    2017-06-06
  • 详解Java中的时间处理与时间标准

    详解Java中的时间处理与时间标准

    这篇文章主要为大家详细介绍了三个时间标准GMT,CST,UTC的规定,以及Java进行时间处理的相关知识,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-09-09
  • 浅析Java8 中 Map 接口的新方法

    浅析Java8 中 Map 接口的新方法

    这篇文章主要介绍了Java8 中 Map 接口的新方法,本文通过代码实例给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-10-10

最新评论