245 - 转换流

1、转换流: InputStreamReader , OutputStreamWriter

【1】转换流作用:将字节流和字符流进行转换

【2】转换流 属于 字节流还是字符流   属于字符流

InputStreamReader  :字节输入流 —> 字符的输入流

OutputStreamWriter  : 字符输出流 —> 字节的输出流

【3】图解: 

输入输出——是相对于程序来说的。

理解:

InputStreamReader ——  把输入方向的字节流转换成输入方向的字符流;

OutputStreamWriter —— 输出方向的字符流转换成输出方向的字节流。

 【4】将输入的字节流转换为输入的字符流,然后完成文件到程序(的查看): 

代码示例:以下代码实现了上图左侧的转换

package test5_;

import java.io.*;

/**
 * @Auther: zhoulz
 * @Description: test5_
 * @version: 1.0
 */
public class Test1 {
    public static void main(String[] args) throws IOException {
        //文件---》程序:
        //1.有一个源文件
        File f = new File("d:\\Test.txt");
        //2、需要一个输入的字节流接触文件:
        FileInputStream fis = new FileInputStream(f);
        //3、加入一个转换流,将字节流转换为字符流:(转换流属于一个处理流)
        //将字节转换为字符的时候,需要指定一个编码,这个编码跟文件本身的编码格式统一
        //如果编码格式不统一的话,那么在控制台上展示的效果就会出现乱码
        //InputStreamReader isr = new InputStreamReader(fis,"utf-8");
                                                               //换成gbk格式就会出错
        //如果不指定编码的话,则会(自动)获取程序本身的编码:utf-8,因为提供了这样的一个构造器
        InputStreamReader isr = new InputStreamReader(fis);

        //4、开始动作,将文件中内容显示在控制台
        char[] ch = new char[20];
        int len = isr.read(ch);
        while (len != -1){
            //System.out.println(ch);
            //System.out.println(len);
            //将缓冲数组转为字符串在控制台上打印出来
            System.out.print(new String(ch,0,len)); //注意,不用换行
            len = isr.read(ch);
        }
        //5、关闭流
        isr.close();
    }
}

2、转换流:InputStreamReader,OutputStreamWriter

     ——  实现文本文件的复制

代码示例:

package test5_;

import java.io.*;

/**
 * @Auther: zhoulz
 * @Description: test5_
 * @version: 1.0
 */
public class Test2 {
    public static void main(String[] args) throws IOException {
        //1、有一个源文件
        File f1 = new File("d:\\Test.txt");
        //2、有一个目标文件
        File f2 = new File("d:\\Demo.txt");
        //3、输入方向
        FileInputStream fis = new FileInputStream(f1);
        InputStreamReader isr = new InputStreamReader(fis,"utf-8");
        //4、输出方向
        FileOutputStream fos = new FileOutputStream(f2);
        OutputStreamWriter osw = new OutputStreamWriter(fos,"gbk");

        //5、开始动作:
        char[] ch = new char[20];
        int len = isr.read(ch);
        while (len != -1){
            osw.write(ch,0,len);
            len = isr.read(ch);
        }

        //6、关闭流
        osw.close();
        isr.close();
    }
}

3、System类对IO流的支持

【1】System的属性:

System.in  : “标准”输入流。---》默认情况下  从键盘输入

System.out  :“标准”输出流。 ---》默认情况下,输出到控制台。

【2】System.in :“标准”输入流。---> 默认情况下  从键盘输入

代码示例:

package test5_;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;

/**
 * @Auther: zhoulz
 * @Description: test5_
 * @version: 1.0
 */
public class Test3_System_in {
    public static void main(String[] args) throws IOException {
        //得到的是标准的输入流 —> 从键盘输入
        /*InputStream in = System.in;
        //调用方法:
        int n = in.read();
        //read方法等待键盘的录入,所以这个方法是一个阻塞方法。
        System.out.println(n);*/

        //以前案例:从键盘录入一个int类型的数据:
        //从上面的代码证明,键盘录入实际上是:System.in
        //形象的理解:System.in是一根管,这个管怼到键盘上去了,所以你从键盘录入的话,就从这个管到程序中了
        //Scanner的作用:扫描器:起扫描作用的,扫键盘录入的从这根管出来的数据
       /*Scanner sc = new Scanner(System.in);
        int i = sc.nextInt();
        System.out.println(i);*/

        //既然Scanner是扫描的作用,那就不一定非得扫System.in进来的东西,
        //还可以扫描其他管的内容,如:
        Scanner sc = new Scanner(new FileInputStream((new File("d:\\Test.txt"))));
        //只要下面有东西,就进行输出
        while (sc.hasNext()){  //用if的话会只读一部分
            System.out.println(sc.next());
        }
    }
}

【3】System.out  :返回的输出流 、 打印流(PrintStream)

代码示例:

package test5_;

import java.io.PrintStream;

/**
 * @Auther: zhoulz
 * @Description: test5_
 * @version: 1.0
 */
public class Test4_System_out {
    public static void main(String[] args) {
        //写到控制台
        PrintStream out = System.out;
        //调用方法
        out.print("你好1");//直接在控制台写出,但是不换行
        out.print("你好2");
        out.print("你好3");
        out.print("你好4");

        out.println("中国人1");//直接在控制台写出,并且换行操作
        out.println("中国人2");
        out.println("中国人3");
        out.println("中国人4");

        System.out.println("你好");
        System.out.println("中国人");
    }
}

4、练习:键盘录入内容输出到文件中

【1】解决思路:

 【2】代码:

package test5_;

import java.io.*;

/**
 * @Auther: zhoulz
 * @Description: test5_
 * @version: 1.0
 */
public class Test5_a_case {
    public static void main(String[] args) throws IOException {
        //1、先准备输入方向
        //键盘录入:
        InputStream in = System.in; //System.in属于字节流!!!
        //字节流 ——> 字符流:
        InputStreamReader isr = new InputStreamReader(in);
        //在isr外面再套一个缓冲流:
        BufferedReader br = new BufferedReader(isr);

        //2、再准备输出方向
        //准备目标文件
        File f = new File("d:\\Demo.txt");
        FileWriter fw = new FileWriter(f);
        BufferedWriter bw = new BufferedWriter(fw);

        //3、开始动作
        String s = br.readLine();
        while (!s.equals("exit")){//条件是:s != null的话,则会一直录入
            bw.write(s);
            bw.newLine();//文件中换行
            s = br.readLine();
        }

        //4、关闭流
        bw.close();
        br.close();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值