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。
目录
相关文章
|
2月前
|
自然语言处理 Java 数据处理
Java IO流全解析:字节流和字符流的区别与联系!
Java IO流全解析:字节流和字符流的区别与联系!
109 1
|
2月前
|
Java 数据处理 开发者
揭秘Java IO流:字节流与字符流的神秘面纱!
揭秘Java IO流:字节流与字符流的神秘面纱!
42 1
|
7月前
|
存储 Java API
【JAVA学习之路 | 进阶篇】(处理流)转换流与对象流
【JAVA学习之路 | 进阶篇】(处理流)转换流与对象流
|
6月前
|
Java 测试技术
Java IO流深度剖析:字节流和字符流的性能对比!
【6月更文挑战第26天】Java IO流分字节流和字符流,字节流处理所有类型数据(如图片),字符流处理文本(基于Unicode)。字节流直接处理,性能高,适合非文本文件;字符流处理文本时考虑编码,适合文本文件。性能测试显示,字节流在读写非文本文件时更快,而字符流在处理文本时更方便。选择流类型应依据数据类型和需求。
83 0
|
7月前
|
缓存 Java
【JAVA学习之路 | 进阶篇】节点流与缓冲流(处理流之一)
【JAVA学习之路 | 进阶篇】节点流与缓冲流(处理流之一)
【Java筑基】IO流基础之常见工具流和进程通信
【Java筑基】IO流基础之常见工具流和进程通信
|
存储 Java
java IO流进阶 对象处理流, 转换流, 打印流
java IO流进阶——对象处理流,转换流,打印流 内容分享。
105 0
|
存储 Java
Java开发——29.I/O流_处理流(缓冲流和转换流)
缓冲流和转换流,就是在某个流的基础上再添加不同的功能以实现对文件更为灵活的操作
Java开发——29.I/O流_处理流(缓冲流和转换流)
Java基础进阶IO流-DataInputStream,DataOutputStream数据流
Java基础进阶IO流-DataInputStream,DataOutputStream数据流
Java基础进阶IO流-DataInputStream,DataOutputStream数据流
|
存储 缓存 Java
Java_IO流01:IO流原理及流的分类
Java_IO流01:IO流原理及流的分类
111 0
Java_IO流01:IO流原理及流的分类