IO加强(三)转换流学习

为了解决编码问题,我们在写入的时候用的指定编码写,然后读的时候就知道原来的编码。可以避免编码问题。也不需要考虑系统的编码。
转换流:
* 1)数据转换
InputStreamReader: 该类本身是字符(Reader)系列, 功能:能够把字节输入流转换成字符输入流
OutputStreamWriter: 该类本身是字符(Writer)系列, 功能:能够把字符输出流转换成字节输出流
2)编码转换
能够对流数据进行字符编码转换

import org.junit.Test;


public class TranferedStreamDemo {

    /* 需求:模拟英文聊天程序,要求:
     (1) 从键盘录入英文字符,每录一行就把它转成大写输出到控制台;
     (2) 保存聊天记录到字节流文件。       */
    @Test
    public void demo1() throws IOException{
        //需求1分析:
        //键盘输入: System.in ---字节流
        //处理字符数据,最好用字符流
        //综上,把字节流转换成字符流处理比较好
        //另外,要把字符按行处理,用缓冲流比较好。又因为已经转换成字符流,所以用字符缓冲流

        //需求2分析:
        //程序中目前的数据是字符数据,用字符流处理比较好
        //同时,题目要求写到字节流文件,最终得用字节流写
        //综上,把字符流转换成字节流处理比较好
        //同理,想操作方便又速度快点,加字符流的缓冲

        InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(isr);

        BufferedWriter bw = new BufferedWriter(
                                new OutputStreamWriter(
                                        new FileOutputStream("chat.txt")
                                )
                            );

        String str=null;
        while((str=br.readLine())!=null){
            str = str.toUpperCase();
            if(str.equals("OVER")){
                break;
            }
            System.out.println(str);
            //bw.write(str+"\n");//Linux方式。该方式用记事本不是换行显示,但写字板是
            //bw.write(str+"\r\n");//windows方式。该方式用记事本和写字板都是换行显示
            bw.write(str);
            bw.newLine();//根据系统平台,自动添加(回车)换行
        }
        bw.close();//凡是字符流,都要记得刷缓存---close()方法在关注的同时会刷一次缓存
    }

    /*字符编码转换演示:读、写
     */
    @Test //采用默认编码(当前MyEclipse中设置的是utf-8)
    public void readDemo1() throws IOException{
        //BufferedReader br = new BufferedReader(new FileReader("test_utf8.txt"));//正常显示
        BufferedReader br = new BufferedReader(new FileReader("test_gbk.txt"));//乱码
        String str=null;
        while( (str=br.readLine())!=null ){
            System.out.println(str);
        }
        br.close();
    }

    @Test //采用我们指定的编码来读---使用InputStreamReader
    public void readDemo2() throws IOException{
        //BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("test_gbk.txt")) ); //默认编码,乱码
        //BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("test_utf8.txt"),"utf-8") ); //解决乱码
        BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("test_gbk.txt"),"gbk") ); //解决乱码
        String str=null;
        while( (str=br.readLine())!=null ){
            System.out.println(str);
        }
        br.close();
    }

    @Test //采用默认编码(当前MyEclipse中设置的是utf-8)
    public void writeDemo1() throws IOException{
        BufferedWriter bw = new BufferedWriter(new FileWriter("test_0.txt"));//以默认编码写(当前MyEclipse设置的是utf-8)
        String str = "湖南城市大学";
        bw.write(str);
        bw.close();
    }

    @Test //以指定的编码进行(和系统的默认编码无关)
    public void writeDemo2() throws IOException{
        //BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("test_1.txt")) );//以系统默认的编码写
        //BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("test1_gbk.txt"),"GBK") );//指定以GBK编码写  ----"gbk"和"GBK"等效
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("test1_utf8.txt"),"UTF-8") );//指定以GBK编码写

        String str = "湖南城市大学";
        bw.write(str);
        bw.close();
    }


    //总之,如果字符文件写入的编码和读取的编码相同则不会出现中文乱码,否则会出现乱码!
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值