java io 流重定向标准输入和输出

2,411 阅读3分钟
原文链接: blog.longjiazuo.com

一. 点睛

我们知道,java默认的标准输入设备是键盘,默认的标准输出设备是显示器,也就是说我们使用java进行物理输入输出编程的时候,如果没有特殊的设定,则System.in默认接收的是键盘输入,System.out则默认输出到显示器屏幕。

如果想改变默认的输入和输出设置,则可以利用System类提供的重定向输入输出方法进行修改。System类提供了下面三个标准的输入输出方法
1. 重定向标准输入流

 public static void setIn(InputStream in);

2. 重定向标准输出流

public static void setOut(PrintStream out);

3. 重定向标准错误输出流

 public static void setErr(PrintStream err);

二. 示例

1. 重定向标准输入

下面的例子使用System类的setIn(InputStream in)方法将System.in的输入来源重定向为文件输入,而不再是键盘输入。业务含义是读取文件自身的内容,然后输出到控制台,代码如下所示:

package org.light4j.io.redirect;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Scanner;

/**
 * 重定向输入测试类
 * 
 * <p>
 * 读取自身文件内容然后输出到控制台
 * </p>
 * 
 * @author longjiazuo
 * 
 */
public class RedirectInput {
    public static void main(String[] args) {
        // 获取工作目录
        String workDir = System.getProperty("user.dir");
        // 获取类名
        String className = Thread.currentThread().getStackTrace()[1].getClassName();
        // 类的路径
        String classPath = workDir + "\\src\\main\\java\\" + className;
        // 反斜杠替换掉"."
        String currentClass = classPath.replace(".", "\\") + ".java";
        Scanner sc=null;
        try
        (
            //新建字节输入流,读取文件自身内容
            FileInputStream fis = new FileInputStream(currentClass);

        ) 
        {
            //重定向标准输入流到FileInputStream
            System.setIn(fis);

            //使用System.in获取标准输入,创建Scanner对象
            //下面的代码sc = new Scanner(System.in)不能和上面的代码System.setIn(fis)位置互换
            //必须先重定向输入流
            sc = new Scanner(System.in);
            //使用回车作为分隔符
            sc.useDelimiter("\n");

            while(sc.hasNextLine()){
                //输出内容到标准输出
                System.out.println(sc.nextLine());
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        }finally{
            if(sc!=null){
                sc.close();
            }
        }
    }
}

运行上面程序之后可以看到,程序并不会等待键盘输入,而是直接在控制台输出了本类RedirectInput.java的代码。这说明程序不再使用键盘作为标准的输入,被重定向为使用文件作为输入源读取数据。

2. 重定向标准输出

下面的例子使用System类的setOut(PrintStream out)方法将System.out的输出重定向输出到文件里面,而不是输出到屏幕上,代码如下所示:

package org.light4j.io.redirect;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;

/**
 * 重定向输出测试类
 * 
 * @author longjiazuo
 * 
 */
public class RedirectOutput {
    public static void main(String[] args) {
        try
        (
            // 创建字节输出流,指定文件为output.txt
            FileOutputStream fos = new FileOutputStream("output.txt");
            //使用PrintStream包装结点流
            PrintStream ps = new PrintStream(fos);
        ) 
        {
            //将输出流重定向到PrintStream
            System.setOut(ps);

            //输出字符
            System.out.println("忆高考\r\n");
            System.out.println("年年忆今朝,忙忙赶国考;\r\n");
            System.out.println("不成真秀才,只图自逍遥。\r\n");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }
}

运行上面程序之后可以看到在控制台并没有任何的打印信息,这说明原来的标准输出被重定向了,不再是输出到屏幕上;并且可以看到在当前的工作空间下会生成一个新的文件output.txt,里面的内容就是我们上面的输出字符。

三. 源代码示例

github地址:点击查看
码云地址:点击查看

打赏 微信扫一扫支付 微信扫一扫,打赏作者吧~ 欢迎关注人生设计师的微信公众账号
公众号ID:longjiazuoA

未经允许不得转载:人生设计师 » java io流重定向标准输入和输出