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。
目录
相关文章
|
17天前
|
Java
【Java基础】输入输出流(IO流)
Java基础、输入输出流、IO流、流的概念、输入输出流的类层次结构图、使用 InputStream 和 OutputStream流类、使用 Reader 和 Writer 流类
79 2
|
4天前
|
Java 测试技术
Java IO流深度剖析:字节流和字符流的性能对比!
【6月更文挑战第26天】Java IO流分字节流和字符流,字节流处理所有类型数据(如图片),字符流处理文本(基于Unicode)。字节流直接处理,性能高,适合非文本文件;字符流处理文本时考虑编码,适合文本文件。性能测试显示,字节流在读写非文本文件时更快,而字符流在处理文本时更方便。选择流类型应依据数据类型和需求。
|
1月前
|
存储 Java API
【JAVA学习之路 | 进阶篇】(处理流)转换流与对象流
【JAVA学习之路 | 进阶篇】(处理流)转换流与对象流
|
10月前
|
Java
java学会这些,我就入门啦!(基础篇五)流与IO流
java学会这些,我就入门啦!(基础篇五)流与IO流
java202303java学习笔记第三十六天字符输入流的底层原理解析2
java202303java学习笔记第三十六天字符输入流的底层原理解析2
49 0
java202303java学习笔记第三十五天字符输入流的底层原理解析1
java202303java学习笔记第三十五天字符输入流的底层原理解析1
52 0
java202303java学习笔记第三十六天字符输入流的底层原理解析3
java202303java学习笔记第三十六天字符输入流的底层原理解析3
125 0
java202303java学习笔记第三十六天字符输入流的底层原理解析4
java202303java学习笔记第三十六天字符输入流的底层原理解析4
43 0
|
存储 Java
java IO流进阶 对象处理流, 转换流, 打印流
java IO流进阶——对象处理流,转换流,打印流 内容分享。
75 0
Java基础进阶IO流-DataInputStream,DataOutputStream数据流
Java基础进阶IO流-DataInputStream,DataOutputStream数据流
Java基础进阶IO流-DataInputStream,DataOutputStream数据流