(86)读取键盘录入、控制台输出语句、流操作规律、System.setIn

System.out:标准输出流,对应标准的输出设备,控制台
System.in:对应的标准输入设备:键盘

/*
 *需求:录入一行数据后,就将该行打印
 * 当录入over时,就停止录入
 */
public class ReadIn {

    public static void main(String[] args)throws IOException {
        InputStream in=System.in;
        StringBuilder sb=new StringBuilder();

        while(true)
        {
            int ch=in.read();//引起循环读
            if(ch=='\r')
                continue;
            if(ch=='\n')
            {
                String s=sb.toString();
                if("over".equals(s))
                    break;
                System.out.println(s.toUpperCase());//大写输出
                sb.delete(0, s.length());//清空sb,否则一直存入,输出的不是刚输入的数据,连带之前输入的数据会一起打印
            }
            else
                sb.append((char)ch);


        }
    }

}

通过刚才的键盘录入一行数据并打印其大写,发现其实就是读一行数据的原理,也就是readLine方法。
能不能直接使用readLine方法来完成键盘录入的一行数据的读取呢?
readLine方法是字符流BufferedReader类中的方法。
而键盘录入的read方法是字节流InputStream的方法。
那么能不能将字节流转换为字符流在再使用字符流缓冲区的readLine方法呢?
InputStreamReader:将字节转换为字符的桥梁
public static final InputStream in

//获取键盘录入对象
        InputStream in=System.in;

        //将字节流对象转换为字符流对象,使用转换流:InputStreamReader
        InputStreamReader isr=new InputStreamReader(in);

        //为了提高效率,将字符串进行缓冲区技术高效操作,使用BufferedReader
        BufferedReader bufr=new BufferedReader(isr);
        //上面三句的简写形式,如下↓
        //BufferedReader Bufr=new BufferedReader(new InputStreamReader(System.in));
        String  line=null;
        while((line=bufr.readLine())!=null){
            if("over".equals(line))//结束标记
                break;
            System.out.println(line.toUpperCase());

        }

将字节流转换为字节流
OutputStreamWriter 是字符流通向字节流的桥梁

    public static void main(String[] args)throws IOException {

        //获取键盘录入对象
        InputStream in=System.in;

        //将字节流对象转换为字符流对象,使用转换流:InputStreamReader
        InputStreamReader isr=new InputStreamReader(in);

        //为了提高效率,将字符串进行缓冲区技术高效操作,使用BufferedReader
        BufferedReader bufr=new BufferedReader(isr);

        OutputStream out= System.out;
        OutputStreamWriter osw=new OutputStreamWriter(out);//将字节流转换为字符流
        BufferedWriter bufw=new BufferedWriter(osw);
        //上面三句的简写形式,如下:↓
       //BufferedWriter Bufw=new BufferedWriter(new OutputStreamWriter(System.out));
        String  line=null;
        while((line=bufr.readLine())!=null){
            if("over".equals(line))//结束标记
                break;
            bufw.write(line.toUpperCase());
            bufw.newLine();
            bufw.flush();


        }
    }

}

流操作的基本规律一:
最痛苦的是流对象有很多,不知道该用哪一个。
通过三个明确来完成。
①,明确原和目的
源:输入流 InputStream Reader
目的:输出流 OutputStream Writer
②,操作的数据是不是纯文本
是:字符流
不是:字节流
③,当体系明确后,再明确要用哪个具体的对象
通过设备来区分:
源设备:内存、硬盘、键盘
目的设备:内存、硬盘、控制台

下面对这三个明确在功能上的应用进行演示:
需求1:将一个文本文件中的数据存储到另一个文件中,即复制文件
①源: InputStream Reader(因为是源,所以可以用读取流)
操作的文本文件:所以选择Reader;
设备是硬盘上的文件,所以用该体系中的操作文件的对象FileReader
是否提高效率:是!加入Reader体系中的缓冲区:BufferedReader
FileReader fr=new FileReader(“a.txt”)
BufferedReader bufr=new BufferedReader(fr);

②目的:
OutputStream Writer(因为是目的,所以用写流)
操作的是文本文件,所以选择Writer.;
设备是文件,所以用该体系中的操作文件的对象FileWriter.
是否提高效率:是!加入Writer体系中的缓冲区:BufferedWriter
FileWriter fw=new FileWriter (“b.txt”)
BufferedWriter bufw=new BufferedWriter(fw);
需求2:将键盘录入的数据保存到一个文件中
源:InputStream Reader
是不是纯文本?是,Reader
设备:键盘,对应的对象是System.in
选择了Reader,但是System.in是个字节流对象,为了操作键盘的文本数据方便,转换为字符流操作最方便,所以要将System.in转换为Reader。(用到了Reader体系中的转换流,InputStreamReader)
InputStreamReader isr=new InputStreamReader(System.in);
想要提高效率:
BufferedReader bufr=new BufferedReader(isr);

目的:OutputStream Writer;
操作的是文本文件,所以选择Writer
设备是文件,所以用该体系中的操作文件的对象FileWriter.
是否提高效率:是,加入Writer体系中的缓冲区:BufferedWriter
FileWriter fw=new FileWriter(b.txt);
BufferedWriter bufw=new BufferedWriter(fw)

扩展一下,想要把录入的数据按照指定的编码表(utf-8字符编码),将数据存入文件中。
目的:OutputStream Writer;
操作的是文本文件,所以选择Writer;
设备是硬盘上的文件,所以用该体系中的操作文件的对象FileWriter.

FileWriter用到的编码表,是默认编码表即系统用到的编码表:GBK(字节编码).要指定的编码只能通过转换流来指定,所以用到了字符输出–>字节输出转换的对象 : OutputStreamWriter.
而该转换流对象要接收一个字节输出流,而且还是可以操作文件的字节输出流:FileOutputStream
public OutputStreamWriter(OutputStream out, Charset cs)创建使用给定字符集的OutputStreamWriter
OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream(“d.txt”),”UTF-8”)
需要高效吗?
BufferedWriter bufw=new BufferedWriter(osw)

小知识点System.setIn、System.setOut
public static void setIn(InputStream in)
public static void setOut(PrintStream out)
public PrintStream(String fileName)

    /*
     * 可以改变输入输出设备,这样就将fos.txt的文件内容以大写的形式输出到fosCopy.txt中
     * 改变输出、输入设备,不过这个不太常用,但是作为System类的方法还是说下
     */
        System.setIn(new FileInputStream("fos.txt"));//标准输入设备是键盘,可通过System.setIn方法改变输入设备
        System.setOut(new PrintStream("fosCopy.txt"));//标准输出流是控制台,可通过System.setOut方法改变输出设备,
        BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));

        BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(System.out));
        String  line=null;
        while((line=bufr.readLine())!=null){
            if("over".equals(line))//结束标记
                break;
            bufw.write(line.toUpperCase());
            bufw.newLine();
            bufw.flush();


        }
    }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值