(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();
        }
    }
 
                    
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号