(八)“标准”的输入流与输出流


1、基本介绍

IO流基础中的第2部分,有关设备 的内容中提到了键盘(标准输入)、控制台(标准输出),下面就详细的介绍一下什么是标准的输入与输出:

标准的输入流与输出流都属于System类的静态成员。
其中in代表的是已经创建好的可以直接从键盘读取的InputStream类型的流对象;

public static final InputStream in

out代表的是已经创建好的可以直接写入数据到控制台的PrintStream类型的流对象;

public static final PrintStream out

对于简单独立的 Java 应用程序,编写一行输出数据的典型方式是:

System.out.println(data)

2、使用标准的输入流

import java.io.IOException;
import java.io.InputStream;

public class Test1 {
public static void main(String[] args) throws IOException {
        Demo1();
}

        public static void Demo1() throws IOException{
        //使用标准输入流,即从键盘直接输入
        InputStream is = System.in;
        /*
         * in是System类的一个静态成员
         * 因此可以通过类名直接访问,即System.in
         * in又是InputStream对象的引用
         * 因此创建InputStream对象is指向in
         */             
        int num = is.read();//每次读取单个字符,返回字节
        //read()方法被称为阻塞式方法,只要没有输入,就会一直等待
        System.out.println((char)num);      
        }
}

3、使用标准的输入流实现简单功能

import java.io.IOException;
import java.io.InputStream;

public class Test2 {
public static void main(String[] args) throws IOException {
        Demo2();
}

    public static void Demo2() throws IOException{
        /*
         * 实现如下功能:
         * 循环读取键盘输入的数据
         * 满一行之后输出大写字符
         * 不满一行进行存储
         */ 
    InputStream in = System.in;
    int num;
    //从键盘输入的都是字符,因此使用StringBuilder处理进行存储
    StringBuilder sb = new StringBuilder();
    while(true){
        num = in.read();
        if(num=='\r'){//windows下换行符为"\r\n"两个字符
            continue;//如果是'\r'就继续   
        }else if(num=='\n'){//如果是'\n'则表示已满一行
        if("over".equals(sb.toString())){
            break;//如果输入"over"结束循环
        }
    System.out.println(sb.toString().toUpperCase());//获得输入的字符串并调用转大写方法
    //在下次输出前清除StringBuilder中存储的字符串
    sb.delete(0, sb.length());//删除从下标0开始到字符串全长也就是末尾的字符
        }else{
            sb.append((char)num);//不满一行就存储数据
        }
    }
}
}

4、优化上述功能

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintStream;

public class Test3 {
public static void main(String[] args) throws IOException {
        Demo3();
    }

    public static void Demo3() throws IOException{
    //使用ReadLine优化Demo2()
        /*
         * 转换流:
         * 可以把字节输入流转换成字符输入流的类:InputStreamReader
         * 可以把字节输出流转换成字符输出流的类:OutputStreamWriter
         */
    //定义标准的字节输入流
    InputStream in = System.in;
    //把字节输入流转换成字符输入流
    InputStreamReader isr = new InputStreamReader(in);
    //为了提高效率,使用BufferedReader
    BufferedReader br = new BufferedReader(isr);

    //定义标准的字符输出流
    PrintStream out = System.out;
    //把字节输出流转换成字符输出流
    OutputStreamWriter osw = new OutputStreamWriter(out);
    //为了提高效率,使用BufferedWriter
    BufferedWriter bw = new BufferedWriter(osw);
            
    String line = null;
    //每次从键盘读取一行
    while((line=br.readLine())!=null){
    if("over".equals(line)){//如果输入"over"结束循环
            break;
    }
    //使用字符流输出
    bw.write(line.toUpperCase());
    bw.newLine();
    bw.flush();
    }
    br.close();
    bw.close();
    }   
}


5、进一步精简上述代码

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Test4{
public static void main(String[] args) throws IOException {
        Demo4();
    }

    public static void Demo4() throws IOException{
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));                   
    String line = null;
    while((line=br.readLine())!=null){
        if("over".equals(line)){
            break;
        }
    //直接使用标准字节流输出
    System.out.println(line.toUpperCase());
        /*
         * 与in类似,out也是定义在System类中的静态成员,所属类型为printStream
         * out就是字节输出流对象,对象可调用println方法,即out.println
         * 对比可见直节使用字节输出流仅需要一行代码
         * 同时也不再需要定义更多的变量
         * 因此在平时使用时常用字节流输出
         */
        }
    br.close();
    }   
}


6、优化标准的输入与输出

之前标准的输入流与输出流是指从键盘直接读取并且写入到控制台,如下:

源(从哪读):键盘
目的(往哪写):控制台

现在要实现从键盘读取,直接写入到文件中,如下:

源(从哪读):键盘
目的(往哪写):文件

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintStream;

public class Test5 {
public static void main(String[] args) throws IOException {
        Demo5();
    }

    public static void Demo5() throws IOException{
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    BufferedWriter bw = new BufferedWriter(new FileWriter("F:\\Demo5.txt"));
    String line = null;
    while((line=br.readLine())!=null){
        if("over".equals(line)){
            break;
        }
        bw.write(line.toUpperCase());
        bw.newLine();
        bw.flush();
    }
    br.close();
    bw.close();
    }
}

接着要实现从文件读取,写入到控制台,如下:

源(从哪读):文件
目的(往哪写):控制台

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class Test6 {
public static void main(String[] args) throws IOException {
        Demo6();
    }

    public static void Demo6() throws IOException{
    BufferedReader br = new BufferedReader(new FileReader("F:\\Demo5.txt"));
    String line = null;
    while((line=br.readLine())!=null){
        if("over".equals(line)){
            break;
        }
        System.out.println(line.toUpperCase());
    }
    br.close();
    }
}

7、改变标准的输入与输出

改变标准的输入:System.setIn();
改变标准的输出:System.setOut();

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintStream;

public class Test7 {
public static void main(String[] args) throws IOException {
        Demo7();
    }

    public static void Demo7() throws IOException{
    System.setIn(new FileInputStream("F:\\Demo5.txt"));//改变标准的输入
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    System.setOut(new PrintStream("F:\\Demo5_copy.txt"));//改变标准的输出
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    String line = null;
    while((line=br.readLine())!=null){
        if("over".equals(line)){
            break;
        }
        bw.write(line.toUpperCase());
        bw.newLine();
        bw.flush();
    }
    br.close();
    bw.close();
    }
}

版权声明:欢迎转载,欢迎扩散,但转载时请标明作者以及原文出处,谢谢合作!             ↓↓↓
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,186评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,858评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,620评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,888评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,009评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,149评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,204评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,956评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,385评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,698评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,863评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,544评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,185评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,899评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,141评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,684评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,750评论 2 351

推荐阅读更多精彩内容