IO(6)----转换流(OutputStreamWriter)

版权声明:未经同意,严禁转载 https://blog.csdn.net/pengchengliu/article/details/82915423

一、转换流概述                                                                                                                                            点击此处返回总目录

二、OutputStreamWriter 转换流

三、InputStreamReader 转换流

四、转换流子类父类的区别

一、转换流概述

中文版操作系统,编码都是GBK的。上一节中最后已经提到了,有的时候文本文件不一定是GBK的。(安装中文版的操作系统是,默认编码是GBK的)。unicode、utf-8等也可以存储中文,在不同的编码表里面,中文的表示含义不同。所以有时候存在编码问题。

不同的编码表,同一个汉字对应的编码是不一样的。比如:

GBK编码中,一个汉字对应2个字节,比如"刘"对应的编码为"-63 -11"。但是在utf-8编码中,一个汉字占3个字节,同样是"刘"对应的编码可能是"-17 -69 -65"。

我们存到文件中的都是字节。

比如我们想通过java程序把"刘"写到文件中,如果要求用GBK写,也就是说要在文件中写入"-63 -11"。这可以使用可以直接使用FileWriter来写入字符,因为默认编码就是GBK的。【例】

如果要求用utf-8写,也就是要在文件中写入"-17 -69 -65 ",怎么办呢?FileWriter不能控制编码表。这就需要用到字符转换流。首先通过字符转换流将汉字转成相应编码表对应的字节,然后调用字节输入流将字节写入文件。

之前学习的FileReader和FileWriter只能采用默认编码表,而不能指定编码。所以今天介绍转换流,可以对编码表进行操作。可以指定Unicode,也可以指定utf-8,这对以后的开发很有用,尤其是互联网程序。

例:使用FileWriter写入汉字,存进文件中的就是汉字在GBK中对应的字节。

package cn.itcast.demo04;

import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;

public class Test {
    public static void main(String[] args) throws IOException{
        FileWriter fw = new FileWriter("e:\\test.txt");
        char[] cbuf = {'刘'};
        fw.write(cbuf);
        fw.close();
        
        InputStream ips = new FileInputStream("e:\\test.txt");
        byte[] b = {0,0};
        ips.read(b);
        System.out.println(b[0]);                  //-63
        System.out.println(b[1]);                  //-11
        ips.close();
        
    }
}

使用FileWriter写入汉字,存进文件中的就是汉字在GBK中对应的字节。

二、OutputStreamWriter 转换流

字符转字节的转换流。

java.io.Object

     java.io.Writer                                //字符输出流

         java.io.OutputStreamWriter      //转换流,可以指定编码表。

              java.io.FileWriter                 //字符输出流,不能指定编码表。

构造方法:

1. OutputStreamWriter(OutputStream out)              //参数是字节输出流。不写码表,则表示采用默认码表。

2. OutputStreamWriter(OutputStream out, String charsetName)         //charsetName是编码表名字。目前能写的有GBK、UTF-8

方法:

转换流OutputStreamWriter是java.io.Writer的子类。是一个字符输出流,用于写文本文件。所以有父类的write()方法。

使用:

package cn.itcast.demo05;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;

public class Test {
    public static void main(String[] args) throws IOException {
        gbk();
        utf();
    }
    

    //转换流对象写文本,文本采用GBK的形式写入。
    public static void gbk() throws IOException{
        FileOutputStream fos = new FileOutputStream("e:\\gbk.txt");      //首先创建一个字节输入流,绑定数据文件。
        OutputStreamWriter osw = new OutputStreamWriter(fos);          //然后创建转换流对象,绑定字节输出流,"GBK"省略。
        osw.write("刘");                        //查看文件,有2个字节。
        
        osw.close();                                                                                 //因为就一个write,所以没有写刷新,直接关了。

                                                                                                           //因为转换流包装了字节流,只需要关转换流即可。
    }
    

    //转换流对象写文本,文本采用utf-8的形式写入。
    public static void utf() throws IOException{
        FileOutputStream fos = new FileOutputStream("e:\\utf.txt");
        OutputStreamWriter osw = new OutputStreamWriter(fos,"utf-8");
        osw.write("刘");                        //查看文件,有3个字节。
        
        osw.close();
    }
    
}

执行过程:首先转换流查找编码表,将字符对应的字节查找出来,然后将字节交给字节输入流写入文件。

FileWriter类是OutputStreamWriter的子类,做的更简单一些,但是不能更改编码表。平时还是FileWriter用的比较多一些。

三、InputStreamReader 转换流

字节转字符的转换流。

java.io.Object

     java.io.Reader                                //字符输入流

         java.io.InputStreamReader         //转换流,可以指定编码表。

              java.io.FileReader                 //字符输出流,不能指定编码表。

构造方法:

1. InputStreamReader(InputStream in)              //参数是字节输入流。不写码表,则表示采用默认码表。

2. InputStreamReader(InputStream in, String charsetName)         //charsetName是编码表名字。目前能写的有GBK、UTF-8

方法:

转换流InputStreamReader是java.io.Reader的子类。是一个字符输入流,用于读文本文件。所以有父类的read()方法。

使用:

package cn.itcast.demo06;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class Test {
    public static void main(String[] args) throws IOException {
        gbk();
        utf();
    }
    
    public static void gbk() throws IOException{
        FileInputStream fis = new FileInputStream("e:\\gbk.txt");
        InputStreamReader isr = new InputStreamReader(fis);       //默认gbk编码。
        char[] ch = new char[1024];
        int len = 0;
        while((len = isr.read(ch))!=-1){
            System.out.print(new String(ch,0,len));
        }
        System.out.println();
    }
    
    public static void utf() throws IOException{
        FileInputStream fis = new FileInputStream("e:\\utf.txt");
        InputStreamReader isr = new InputStreamReader(fis,"utf-8");
        char[] ch = new char[1024];
        int len = 0;
        while((len = isr.read(ch))!=-1){
            System.out.print(new String(ch,0,len));
        }
        System.out.println();
    }
    
}

执行过程:首先字节输出流将字节读出来交给转换流,然后转化流查找对应的编码表将对应的字符输出。

四、转换流子类父类的区别

java.io.Object

     java.io.Writer                                //字符输出流

         java.io.OutputStreamWriter      //转换流,可以指定编码表。

              java.io.FileWriter                 //字符输出流,不能指定编码表。

OutputStreamWriter 和FileWriter都属于字符输出流。

OutputStreamWriter、InputStreamReader是字符转字节的桥梁,也称之为字符转换流。因为可以指定编码表。

而子类,FileWriter、FileReader不能指定编码表,方便了我们的操作。

用的时候,如果想改变或指定编码时,就得需要用到转换流。

如果使用默认编码表,就可以使用子类。

猜你喜欢

转载自blog.csdn.net/pengchengliu/article/details/82915423