Java转换流(InputStreamReader/OutputStreamWriter)

news2025/1/12 15:47:11

在这里插入图片描述

文章目录

  • 概述
  • 为什么会有转换流?
  • 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等)


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/180390.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1.设计模式的前奏

哪些维度评判代码质量的好坏? 常用的评价标准 可维护性(maintainability):维护代码的成本可读性(readability)可扩展性(extensibility):码应对未来需求变化的能力灵活性&#xff0…

【keepass】密码管理软件-推荐插件和相关工具合集-keepass工作流分析(自动填充、美化界面、快速添加记录、安全增强、软件和数据库维护类)

Keepass有很多已经开源的插件,生态良好,在官网有专门的插件推荐区。安装插件的方法很简单,直接把下载好的插件文件放在plugins文件夹内,重启软件即可。下面我以几大功能推荐一些keepass插件或搭配使用的浏览器扩展,以求…

Coolify系列-手把手教学解决局域网局域网中的其他主机访问虚拟机以及docker服务

背景 我在windows电脑安装了一个VM,使用VM开启了Linux服务器,运行docker,下载服务镜像,然后运行服务,然后遇到了主机无法访问服务的问题。 问题排查 STEP1:首先要开启防火墙端口,这个我的Coolify系列其他文章有详细…

【c++】设置控制台窗口字体颜色和背景色(system和SetConsoleTextAttribute函数 )(内含超好玩的c++游戏链接)

目录 游戏推荐 研究初步 SetConsoleTextAttribute函数 原型 参数 举个栗子 最后 题外话 一篇游戏笔记。。。 游戏推荐 最近,在玩(完)一个c的控制台游戏。 啊,真的非常好玩。虽然是一个文字游戏,但有很多隐…

分享137个ASP源码,总有一款适合您

ASP源码 分享137个ASP源码,总有一款适合您 下面是文件的名字,我放了一些图片,文章里不是所有的图主要是放不下..., 137个ASP源码下载链接:https://pan.baidu.com/s/13nF0yADJhSBonIFUIoymPQ?pwdmsl8 提取码&#x…

【C++】位图、布隆过滤器概念与模拟实现

目录 一、位图 1.1 位图的概念 1.2 位图的使用 1.3 位图的实现 1.4 位图的应用 二、布隆过滤器 2.1 布隆过滤器 2.2 布隆过滤器的实现 2.3 布隆过滤器练习题 一、位图 1.1 位图的概念 所谓位图,就是用每一位来存放某种状态,适用于海量数据&am…

监控Python 内存使用情况和代码执行时间

我的代码的哪些部分运行时间最长、内存最多?我怎样才能找到需要改进的地方?” 在开发过程中,我很确定我们大多数人都会想知道这一点,而且通常情况下存在开发空间。在本文中总结了一些方法来监控 Python 代码的时间和内存使用情况…

【24】C语言 | 调试技巧

目录 1、调试概念: 2、Debug和Release的介绍 3、windows中的快捷键 4、案例一:求1! 2!3!...n! 5、案例二:下面的代码输出什么? 6、案例三:实现一个strcopy的函数 …

零入门容器云网络实战-3->Underlay网络与Overlay网络总结

本篇文章主要用于收集、整理、总结关于Underlay网络以及overlay网络相关知识点。 1、underlay网络介绍? 1.1、什么是underlay网络? Underlay网络就是: 传统IT基础设施网络,由交换机和路由器等设备组成,借助以太网协议…

3分钟搭建起聊天机器人需要的NoneBot2环境

创建nonebot2运行环境 官网上说这里的Python版本要高于3.8.0,还会有其他的依赖。 所以这里推荐大家使用虚拟环境,Poetry、venv、Conda,我这里用的是conda环境(不同的项目依赖可能有所不同,所以才创建虚拟环境&#xf…

[羊城杯 2020]EasySer

目录 信息搜集 代码审计 参数扫描 信息搜集 先扫下目录 .htaccess&#xff1b;robots.txt&#xff1b;flag.php&#xff1b;index.php 在robots.txt下看到了/star1.php 进入star1.php发现出现ser.php <!-- 小胖说用个不安全的协议从我家才能进ser.php呢&#xff01; !--…

蓝桥杯刷题015——最少刷题数(二分法+前缀和)

问题描述 小蓝老师教的编程课有 N 名学生, 编号依次是 1…N 。第 i 号学生这学期刷题的数量是 Ai​ 。 对于每一名学生, 请你计算他至少还要再刷多少道题, 才能使得全班刷题比他多的学生数不超过刷题比他少的学生数。 输入格式 第一行包含一个正整数 N 。 第二行包含 N 个整数:…

学成在线项目开发技巧整理---第一部分

学成在线项目开发技巧整理---第一部分1.数据字典2.http-client远程测试插件,可以保存测试数据3.三种跨域解决4.具有多层级数据查询思路5.Mybaits分页插件原理6.根据文件后缀解析出mime-type7.大文件上传8.Spring事务什么时候会失效9.分布式文件系统MinIo10.构建独立文件系统11.…

3.3Sram和Dram

文章目录一、引子二、存储元件1.DRAM芯片&#xff08;1&#xff09;栅极电容1&#xff09;存储2&#xff09;读出&#xff08;2&#xff09;物理特性&#xff08;3&#xff09;DRAM刷新&#xff08;4&#xff09;DRAM地址线复用2.SRAM芯片&#xff08;1&#xff09;双稳态触发器…

爬虫之JS的解析

JS的解析 学习目标&#xff1a; 了解 定位js的方法了解 添加断点观察js的执行过程的方法应用 js2py获取js的方法 1 确定js的位置 对于前面人人网的案例&#xff0c;我们知道了url地址中有部分参数&#xff0c;但是参数是如何生成的呢&#xff1f; 毫无疑问&#xff0c;参数肯…

gin全解

文章目录介绍安装快速开始&#xff08;三种启动方式&#xff09;参数获取querystring参数其他不常用方法表单参数&#xff08;form参数&#xff09;其他不常用方法获取path参数参数绑定文件上传单个文件多个文件请求&#xff08;ctx.Request)响应gin.H{}字符串响应JSON/YAML/TO…

一起自学SLAM算法:8.2 Cartographer算法

连载文章&#xff0c;长期更新&#xff0c;欢迎关注&#xff1a; Gmapping代码实现相对简洁&#xff0c;非常适合初学者入门学习。但是Gmapping属于基于滤波方法的SLAM系统&#xff0c;明显的缺点是无法构建大规模的地图&#xff0c;这一点已经在第7章中讨论过了。而基于优化的…

Python爬虫之findall和lxml

Python爬虫之findall和lxml 提示&#xff1a;前言 Python爬虫之findall和lxml 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录Python爬虫之findall和lxml前言一、导入包二、设置URL和获取视频链接三、解析视频名字…

31. 实战:PyQuery获取小电视Top100详细信息(文末源码)

目录 前言 &#xff08;链接放在评论区&#xff09;&#xff08;链接放在评论区&#xff09;&#xff08;链接放在评论区&#xff09; 目的 &#xff08;链接放在评论区&#xff09;&#xff08;链接放在评论区&#xff09;&#xff08;链接放…

趣味三角——第4章——三角学迈向解析化

第4章 三角学迈向解析化(或分析化) 目录 4.1 三角学迈向解析化的过程简述 4.2 Franois Vieter对三角学解析化的贡献 “Thus the analysis of angular sections involves geometric and arithmetic secrets which hitherto have been penetrated by no one(因此&#xf…