ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

转换流的原理与OutputStreamWriter介绍&代码实现与OutputStreamWriter介绍&代码实现

2022-07-13 12:03:16  阅读:232  来源: 互联网

标签:编码 OutputStreamWriter 字节 字符 FileReader 代码 GBK 介绍 write


转换流的原理-InputStreamReader-OutputStreamWriter

编码引出的问题 --FileReader读取GBK格式的文件 会乱码 相当于ide默认的utf-8读取GBK编码的汉字 表示的字节不同会报错

FileReader可以读取IDE默认编码格式UTF-8的文件,
但是FileReader读取系统默认编码(中文系统默认GBK格式)会产生乱码

package Synchronized_demo.Synchroned_Demo01;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

/*
FiLeReader可以读取IDE黑默t认编码格式(UTF-8)的文件FiLeReaderi读取系统黑认编码(中文GBK)会产生乱码
 */
public class Demo01_Dewl {
    public static void main(String[] args) throws IOException {
        FileReader reader = new FileReader("G:\\xiangmu\\jichu\\wenjianjia\\b.txt");
        int len = 0;
        while ((len = reader.read())!=-1){
            System.out.println((char) len);
        }
        reader.close();
    }
}

 

注意:

FileReader

1.其实所有的底层都是FileInputStream来读的,先读取到字节 再FileReader(这个时候用的UTF-8来解码的来read的)把字节转换为字符(相当于解码)

但是如果存储的是GBK格式,则FileInputStream读取的字节时Gbk格式 但是FileReader仍然用UTF-8来,则会产生乱码(编码和解码不对应,会乱码所以FileReader只能读取ide默认格式编码的文件)

不用FileReader读了用InputStreamReader来读既可以查询默认的UTF-8又可以查询指定的码表比如GBK或者其他的

2.FileWriter

只能查询Ide的默认码表,吧字符转换为字节(编码把看懂的转换成看不懂的)还是会用到FileOutputStream依次把字节写入到硬盘中(只能写Utf-8)

如果要写GBK格式的文件

用OutputStreamWriter 既可以把字符转化为默认的又可以转化为指定的码表 ,然后FileOutputStream写入到硬盘中(注意FileOutputStream只能写UTF-8)

public class InputStreamReader extends Reader
InputStreamReader 是字节流通向字符流的桥梁:它使用指定的charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。
每次调用InputStreamReader中的一个read()方法都会导致从底层输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。

package Synchronized_demo;

import java.io.*;

/*
        java.io.Outputstreamlwriter extends writer
outputstreamwnriter:是字符流通向字节流的桥梁:可使用指定的 charset将要写入流中的字符编码成字节。(编码:把能看懂的变成看不懂)继续自父类的共性成员方法:
- void write(int c)写入单个字符。
- void write( char[ ] cbuf)写入字符数组。
- abstractvoid write(char[ ] cbuf,int off, int Len)写入字符数组的某一部分, off数组的开始索引,Len写的字符个数。- void iwrite( String str)写入字符串。
- void write(String str,int off, int len)写入字符串的某一部分, off字符串的开始索引, Len写的字符个数。- void flush()刷新该流的缓冲。
- void close()关闭此流,但要先刷新它。构造方法:
outputStreamwriter(OutputStream out)创建使用认字符编码的outputStreamwriter。
outputStreamwriter(OutputStream out,String charsetName)创建使用指定字符集的 outputStreamwriter。参数:
outputstream out:字节输出流,可以用来写转换之后的字节到文件中
String charsetName :指定的编码表名称,不区分大小写,可以是utf-8/UTF-8, gbk/GBK,. ..不指定默认使用UTF-8
使用步骤:
1.创建outputStreamlwriter对象,构造方法中传递字节输出流和指定的编码表名称
2.使用outputstreamriter对象中的方法write,把字符转换为字节存储缓冲区中(编码)
3.使用outputstreamvriter对象中的方法flush,把内存缓冲区中的字节刷新到文件中(使用字节流写字节的过程)
4.释放资源
     */
public class Demo02OutStreamWitrew {
        public static void main(String[] args) throws IOException {
            //write_utf_8();
            write_GBK();
        }
         /*
            使用转换流outputstreamwriter写GBK格式的文件
             */
    private static void write_GBK() throws IOException {
        //1.创建outputstreamiwriter对象,构造方法中传递字节输出流和指定的编码表名称
        OutputStreamWriter os = new OutputStreamWriter(new FileOutputStream("G:\\xiangmu\\jichu\\wenjianjia\\a.txt"),"GBK");
        //2.使用outputstreamriter对象中的方法write,把字符转换为字节存储缓冲区中(编码)
        os.write("你不好");
        //3.使用outputstreamvriter对象中的方法flush,把内存缓冲区中的字节刷新到文件中(使用字节流写字节的过程)
        os.flush();
        //4.释放资源
        os.close();
    }
            /*
            使用转换流outputstreamwriter写UTF-8格式的文件
             */

        private static void write_utf_8() throws IOException {
            //1.创建outputstreamiwriter对象,构造方法中传递字节输出流和指定的编码表名称
            OutputStreamWriter os = new OutputStreamWriter(new FileOutputStream("G:\\xiangmu\\jichu\\wenjianjia\\b.txt"),"UTF-8");
            //2.使用outputstreamriter对象中的方法write,把字符转换为字节存储缓冲区中(编码)
            os.write("你不好");
            //3.使用outputstreamvriter对象中的方法flush,把内存缓冲区中的字节刷新到文件中(使用字节流写字节的过程)
            os.flush();
            //4.释放资源
            os.close();
        }
    }

 

标签:编码,OutputStreamWriter,字节,字符,FileReader,代码,GBK,介绍,write
来源: https://www.cnblogs.com/x3449/p/16473361.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有