Java_IO流04:处理流之二:转换流

简介: Java_IO流04:处理流之二:转换流

@[toc]

处理流之二:转换流的使用

:o::Java API提供了两个转换流(处于字符体系之下,看后缀识别)

  • InputStreamReader:将InputStream转换为Reader(字节输入流转换为字符的输入流)
  • OutputStreamWriter:将Writer转换为OutputStream(字符的输出流转换为字节的输出流)

在这里插入图片描述

基本知识
  1. 基本了解
  • 转换流提供了在字节流和字符流之间的转换
  • 字节流中的数据都是字符时,转成字符流操作更高效
  • 很多时候我们使用转换流来处理文件乱码问题。实现编码和解码的功能。
  • 解码:字节、字节数组——>字符数组、字符串(看不懂的变成看得懂的叫解码)
  • 编码:字符数组、字符串——>字节、字节数组(看得懂的变成看不懂的叫编码)
InputStreamReader

:o::InputStreamReader

  • 实现将字节的输入流按指定字符集转换为字符的输入流。
  • 需要和InputStream“套接”
  • 构造器

    • 默认字符集:public InputStreamReader(InputStream in)
    • 指定字符集:public InputSreamReader(InputStream in,String charsetName)
    • 注:这里选择的字符集根据文件保存的时候的编码集决定
  • 处理异常仍然使用try-catch-finally

例子1:用字节流去读,然后用转换符转化为字符流

@Test
public void test1() {
    InputStreamReader isr2= null;//这里选择的字符集根据文件保存的时候的编码集决定
    try {
        FileInputStream fis = new FileInputStream("垃圾回收机制.txt");
        // InputStreamReader isr=new InputStreamReader(fis);//使用默认的编码集
        isr2 = new InputStreamReader(fis,"utf-8");

        //读到内存里面
        char[] chars = new char[20];
        int len;
        while ((len=isr2.read(chars))!=-1){
            String str=new String(chars,0,len);
            System.out.println(str);
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (isr2!=null)
            isr2.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
OutputStreamWriter

:o::OutputStreamWriter

  • 实现将字符的输出流按指定字符集转换为字节的输出流
  • 需要和OutputStream“套接”
  • 构造器

    • 默认字符集:public OutputStreamWriter(OutputStream out)
    • 指定字符集:public OutputSreamWriter(OutputStream out,String charsetName)

例子2:InputStreamReader和OutputStreamWriter综合使用,把utf-8存的文件以gbk复制

在这里插入图片描述

@Test
public void test2(){
    InputStreamReader isr= null;
    OutputStreamWriter osw= null;
    try {
        //1.造文件造流
        File file1 = new File("垃圾回收机制.txt");
        File file2 = new File("垃圾回收机制(gbk).txt");

        FileInputStream fis= new FileInputStream(file1);
        FileOutputStream fos=new FileOutputStream(file2);

        isr = new InputStreamReader(fis,"utf-8");
        osw = new OutputStreamWriter(fos,"gbk");
        //2.读写过程
        char[] chars = new char[10];
        int len;
        while ((len=isr.read(chars))!=-1){
            osw.write(chars,0,len);
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        //关闭资源
        try {
            if (osw!=null)
            osw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            if (isr!=null)
            isr.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
编码集科普

编码表的由来:

  • 计算机只能识别二进制数据,早期由来是电信号。为了方便应用计算机,让它可以识 别各个国家的文字。就将各个国家的文字用数字来表示,并一一对应,形成一张表。 这就是编码表。

常见的编码表(字符集):

  • ASCII:美国标准信息交换码,用一个字节的7位可以表示。
  • ISO8859-1:拉丁码表。欧洲码表 ,用一个字节的8位表示。
  • GB2312:中国的中文编码表。最多两个字节编码所有字符
  • GBK:中国的中文编码表升级,融合了更多的中文文字符号。最多两个字节编码
  • Unicode:国际标准码,融合了目前人类使用的所有字符。为每个字符分配唯一的字符码。所有的文字都用两个字节来表示。
  • UTF-8:变长的编码方式,可用1-4个字节来表示一个字符。

转换流的编码应用:

  • 可以将字符按指定编码格式存储
  • 可以对文本数据按指定编码格式来解读
  • 指定编码表的动作由构造器完成

补充:字符编码

  • Unicode不完美,这里就有三个问题,一个是,我们已经知道,英文字母只用 一个字节表示就够了,第二个问题是如何才能区别Unicode和ASCII?计算机 怎么知道两个字节表示一个符号,而不是分别表示两个符号呢?第三个,如果 和GBK等双字节编码方式一样,用最高位是1或0表示两个字节和一个字节, 就少了很多值无法用于表示字符,不够表示所有字符。Unicode在很长一段时 间内无法推广,直到互联网的出现。
  • 面向传输的众多 UTF(UCS Transfer Format)标准出现了,顾名思义,UTF8就是每次8个位传输数据,而UTF-16就是每次16个位。这是为传输而设计的 编码,并使编码无国界,这样就可以显示全世界上所有文化的字符了。
  • Unicode只是定义了一个庞大的、全球通用的字符集,并为每个字符规定了唯 一确定的编号,具体存储成什么样的字节流,取决于字符编码方案。推荐的 Unicode编码是UTF-8和UTF-16。
目录
相关文章
|
Java
|
10天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1210 5
|
9天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
1172 87
|
9天前
|
云栖大会
阿里云云栖大会2025年9月24日开启,免费申请大会门票,速度领取~
2025云栖大会将于9月24-26日举行,官网免费预约畅享票,审核后短信通知,持证件入场
1765 12
|
19天前
|
人工智能 运维 安全

热门文章

最新文章