Java攻城狮的入门课程Java学习笔记程序员

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

2017-03-13  本文已影响86人  黒猫

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();
    }
}

版权声明:欢迎转载,欢迎扩散,但转载时请标明作者以及原文出处,谢谢合作!             ↓↓↓
上一篇下一篇

猜你喜欢

热点阅读