Java IO流 - 转换流的使用详细介绍

news2025/1/10 17:19:00

文章目录

    • 转换流
      • 字符输入转换流
      • 字符输出转换流

转换流

之前我们代码编码和文件编码都是UTF-8, 所以没有出现中文乱码的问题

我们知道代码编码和文件编码的格式如果不一致的话会出现中文乱码的问题

那么如果在开发中, 我们确实会遇到编码不一致的情况如何解决呢?

我们可以使用字符输入转换流

可以提取文件(GBK)的原始字节流,原始字节不会存在问题。

然后把字节流以指定编码转换成字符输入流,这样字符输入流中的字符就不乱码了

在这里插入图片描述

字符输入转换流

字符输入转换流: 实现类InputStreamReader, 可以把原始的字节流按照指定编码转换成字符输入流

字符输入转换流常用构造器如下(我们常用的是第二个构造器, 第一个构造器几乎不用):

构造器说明
InputStreamReader(InputStream is)可以把原始的字节流按照代码默认编码转换成字符输入流。(几乎不用,与默认的FileReader一样)
InputStreamReader(InputStream is ,String charset)可以把原始的字节流按照指定编码转换成字符输入流,这样字符流中的字符就不乱码了(重点)

例如我们文件编码是"GBK", 代码编码是UTF-8

public static void main(String[] args) throws Exception {
    // 代码UTF-8 文件GBK
    // 1. 提取GBK文件的原始字节流
    InputStream is = new FileInputStream("/Users/chenyq/Documents/test2.txt");

    // 2. 字符输入转换流: 把原始字节流转为字符输入流(以GBK编码的方式将文件转为字符输入流)
    Reader isr = new InputStreamReader(is, "GBK");

    // 3. 把转换的字符输入流再转换为缓冲输入流
    BufferedReader br = new BufferedReader(isr);

    // 读取文件内容
    String line;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }
}

字符输出转换流

如果我们需要控制写出去的字符所使用的编码可以怎么做?

方式一: 可以把字符以指定编码获取字节后再使用字节输出流写出去(该方法在前面文章, 字符集编码解码讲过)

  • “我爱你中国”.getBytes(编码)

方式二: 可以使用字符输出转换流实现。

字符输出转换流:

字符输入转换流:OutputStreamWriter,可以把字节输出流按照指定编码转换成字符输出流。

字符输出转换流常用构造器如下(我们常用的是第二个构造器, 第一个构造器几乎不用):

构造器说明
OutputStreamWriter(OutputStream os)可以把原始的字节输出流按照代码默认编码转换成字符输出流。几乎不用。
OutputStreamWriter(OutputStream os,String charset)可以把原始的字节输出流按照指定编码转换成字符输出流(重点)
public static void main(String[] args) throws Exception {
    // 1. 定义一个原始字节输出流
    OutputStream os = new FileOutputStream("/Users/chenyq/Documents/test2.txt");

    // 2. 字符转换输出流: 将原始的字节输出流转为字符输出流(指定GBK编码的方式写字符出去)
    Writer osw = new OutputStreamWriter(os, "GBK");

    // 3. 将转换的原始字符输出流载转换为缓冲字符输出流
    Writer bw = new BufferedWriter(osw);

    bw.write("我爱中国");
    bw.write("我爱学习");
    bw.write("我爱Java");

    bw.close();
}

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

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

相关文章

【高阶数据结构】手撕红黑树(超详细版本)

🌈欢迎来到数据结构专栏~~手撕红黑树 (꒪ꇴ꒪(꒪ꇴ꒪ )🐣,我是Scort目前状态:大三非科班啃C中🌍博客主页:张小姐的猫~江湖背景快上车🚘,握好方向盘跟我有一起打天下嘞!送给自己的一句…

JMS规范和AMQP协议

参考资料:《JMS与AMQP简述以及比较》《AMQP协议详解》《MQ消息队列的JMS规范和AMQP协议的区别》《消息队列之JMS和AMQP对比》写在开头:本文为学习后的总结,可能有不到位的地方,错误的地方,欢迎各位指正。一般情况下MQ的…

【数据结构与算法——C语言版】6. 排序算法(3)——插入排序

前言 在本系列的上两篇文章分别介绍了两种O(n2)的排序算法——选择排序和冒泡排序,今天是第三种O(n2)的排序算法:插入排序。 插入排序 核心思想 它的基本思想是将一个记录插入到已经排好序的有序表中,从而产生一个新的、记录数增 1 的有序…

软件测试~自动化测试Seleniums---1

一.什么是自动化测试 1.自动化测试介绍 自动化测试指软件测试的自动化,在预设状态下运行应用程序或者系统,预设条件包括正常和异常,最后评估运行结果。将人为驱动的测试行为转化为机器执行的过程。 将测试人员双手解放,将部分测…

机器视觉(十):印刷体字符识别

目录: 机器视觉(一):概述 机器视觉(二):机器视觉硬件技术 机器视觉(三):摄像机标定技术 机器视觉(四):空域图像增强 …

Unreal模块创建流程

可以把开发中通用的功能封装成模块,以在不同项目之间复用,这里记录一下创建模块的步骤:在工程的Source文件夹中新建文件夹,命名为模块名称TestCustomModule:如果要区分模块内脚本的公私有权限,则在模块文件夹内创建Public和Private文件夹,这里我没有区分,就不创建了:在模块文件…

Js如何实现一个累加向上漂浮动画

前言 在不久之前,看到一个比较有意思的小程序,就是静神木鱼,可以实现在线敲木鱼,自动敲木鱼,手盘佛珠,静心颂钵的 整个小程序功能比较小巧,大道至简,曾风靡过一阵的,无论在App应用市场上,还是小程序里,一些开发者都赚得盆满钵满,用于缓解当代年轻人的一个焦虑,佛系解压,算是一…

Kubernetes:通过轻量化工具 kubespy 实时观察YAML资源变更

写在前面 分享一个小工具 kubespy 给小伙伴博文内容涉及: 工具的简单介绍下载安装以 kubectl 插件方式使用 Demo 理解不足小伙伴帮忙指正 我所渴求的,無非是將心中脫穎語出的本性付諸生活,為何竟如此艱難呢 ------赫尔曼黑塞《德米安》 简单介…

详解二分查找的两种写法以及二分查找的六种变形

目录 一、二分查找的两种写法 1.1 - 第一种写法(左闭右闭) 1.2 - 第二种写法(左闭右开) 二、二分查找的六种变形 2.1 - 查找第一个 target 的元素位置 2.2 - 查找第一个 > target 的元素位置 2.3 - 查找第一个 > ta…

JS类型转换机制

概述 JS中有六种简单数据类型:undefined、null、boolean、string、number、symbol,以及引用类型:object 但是我们在声明的时候只有一种数据类型,只有到运行期间才会确定当前类型let x y ? 1 : a; ,x的值在编译阶段…

FPGA基础之内置逻辑门

verilog语言中,针对逻辑门,有许多内置可直接使用的逻辑门,从输入输出数量可分为多输入门和多输出门。 一、多输入门 有单个或多个输入,只有单个输出的逻辑门,包含and(与),or(或),xor(异或)&am…

在训练心脏数据集时碰到的问题汇总

在训练心脏数据集时碰到的问题汇总: 1.nii数据处理问题 心脏CT数据集采用的是医学图像常用的压缩文件格式nii,且储存的图像为3D图像,不能直接使用。 首先应导入SimpleITK包,利用如下三个函数进行nii格式文件的提取。 sitk.ReadI…

vlan间的通信

vlan之间要通过三层通信实现互访,三层通信需借助三层设备 如果之前配置了 hybrid模式想删除 命令 undo port link-type hybrid vlan all [Huawei-GigabitEthernet0/0/3]dis this interface GigabitEthernet0/0/3 undo port hybrid vlan 1 这里可以理解为多删了一个…

【python】【数据分析】2022年全国大学生数据分析大赛题解-医药电商销售数据分析

文章目录一、前言二、题目三、题解1.对店铺进行分析,一共包含多少家店铺,各店铺的销售额占比如何?给出销售额占比最高的店铺,并分析该店铺的销售情况。2.对所有药品进行分析,一共包含多少个药品&#xff0c…

Promise和async/await

1、回调地狱 多层回调函数的相互嵌套,就形成了回调地狱。示例代码如下: 回调地狱的缺点: 代码耦合性太强,牵一发而动全身,难以维护大量冗余的代码相互嵌套,代码的可读性变差 1.1、如何解决回调地狱的问题…

手把手实现邮件分类 《Getting Started with NLP》chap2:Your first NLP example

《Getting Started with NLP》chap2:Your first NLP example 感觉这本书很适合我这种菜菜,另外下面的笔记还有学习英语的目的,故大多数用英文摘录或总结 文章目录《Getting Started with NLP》chap2:Your first NLP example2.1 Introducing N…

数据结构与算法【树】

二叉树性质 满二叉树 深度为k,有2k−12^{k}-12k−1个结点的二叉树,为满二叉树。 完全二叉树 完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面…

CSDN第22期周赛(记录一下,不是题解)

希望23年能收获一两本程序员杂志 前言 发现一个问题,codeblocks上编译没问题,在CSDN比赛时,会报错: 1,size()和length()属于unsigned int,所以与之比较大小或者赋值的 i, j 也要用unsigned int&#xf…

巧解 JavaScript 中的嵌套替换

网友 wys 提问&#xff1a;如何仅使用 JavaScript 支持的正则语法&#xff0c;将 <p> <table> <p> <p> </table> <table> <p> <p> </table> <p>中<table>...</table>之间的<p>都替换为<b…

C库函数:stdio.h

stdio.h C 标准库 – <stdio.h> | 菜鸟教程 (runoob.com) 下面是头文件 stdio.h 中定义的变量类型&#xff1a; 序号变量 & 描述1size_t 这是无符号整数类型&#xff0c;它是 sizeof 关键字的结果。2FILE 这是一个适合存储文件流信息的对象类型。3fpos_t 这是一个适…