12.5 重定向标准输入输出


Java标准输入输出分别通过System.in和System.out来代表,在默认情况下它们分别代表键盘和显示器,当程序通过System.in来获取输入时,实际上是从键盘获取输入;当程序通过System.out来获取输出时,程序总是输出到屏幕。
在System类里提供了如下三个重定向标准输入/输出的方法:
★static void setErr(PrintStream err):重定向“标准”错误输出流。
★static void setIn(InputStream in):重定向"标准"标准输入流。
★static void setOut(PrintStream out):重定向"标准"标准输出流。

一、重定向输出

下面程序通过重定向标准输出流,将System.out的输出重定向到文件输出,而不是屏幕输出。

package section5;

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

public class RedirectOut
{
    public static void main(String[] args)
    {
    try(
            //一次性创建PrintStream输出流
            var ps=new PrintStream(new FileOutputStream("src/section5/out.txt"))
    )
    {
            //将标准输出重定向到ps输出流
            System.setOut(ps);
            //向标准输出输出一个字符串
            System.out.println("普通字符串");
            //向标准输出输出一个对象
            System.out.println(new RedirectOut());
    }
    catch (IOException ioe)
    {
        ioe.printStackTrace();
    }
    }
}
程序运行结束后,将看到一个out.txt文件,里面的内容如下:
普通字符串
section5.RedirectOut@5f184fc6

上面程序中 var ps=new PrintStream(new FileOutputStream("src/section5/out.txt")创建了一个PrintSream输出流,并将系统的标准输出重定向到该PrintStream输出流。运行上面的程序将看不到任何输出——这意味着标准输出不再输出到屏幕,而是输出到out.txt文件中,即可看到文件里的内容,正好于程序中一致。

二、重定向输入

下面程序重定向标准输入,从而可以将System.in重定向指定文件,而不是键盘输出。

package section5;

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

public class RedirectIn
{
    public static void main(String[] args)
    {
        try(
                var fis =new FileInputStream("src\\section5\\RedirectIn.java")
                )
        {
            //将标准输入重定向到fis输入流
            System.setIn(fis);
            //使用System.in创建Scanner对象,用于获取标准输入
            var sc=new Scanner(System.in);
            //增加一行把回车符作为分隔符
            sc.useDelimiter("\n");
            //判断是否华友下一个输入项
            while(sc.hasNext())
            {
                //输出输入项:
                System.out.println("键盘输出的内容是:"+sc.next());
            }
        }
        catch (IOException ioe)
        {
            ioe.printStackTrace();
        }
    }
}
键盘输出的内容是:package section5;
键盘输出的内容是:
键盘输出的内容是:import java.io.FileInputStream;
键盘输出的内容是:import java.io.IOException;
键盘输出的内容是:import java.util.Scanner;
键盘输出的内容是:
键盘输出的内容是:public class RedirectIn
键盘输出的内容是:{
键盘输出的内容是:    public static void main(String[] args)
键盘输出的内容是:    {
键盘输出的内容是:        try(
键盘输出的内容是:                var fis =new FileInputStream("src\\section5\\RedirectIn.java")
键盘输出的内容是:                )
键盘输出的内容是:        {
键盘输出的内容是:            //将标准输入重定向到fis输入流
键盘输出的内容是:            System.setIn(fis);
键盘输出的内容是:            //使用System.in创建Scanner对象,用于获取标准输入
键盘输出的内容是:            var sc=new Scanner(System.in);
键盘输出的内容是:            //增加一行把回车符作为分隔符
键盘输出的内容是:            sc.useDelimiter("\n");
键盘输出的内容是:            //判断是否华友下一个输入项
键盘输出的内容是:            while(sc.hasNext())
键盘输出的内容是:            {
键盘输出的内容是:                //输出输入项:
键盘输出的内容是:                System.out.println("键盘输出的内容是:"+sc.next());
键盘输出的内容是:            }
键盘输出的内容是:        }
键盘输出的内容是:        catch (IOException ioe)
键盘输出的内容是:        {
键盘输出的内容是:            ioe.printStackTrace();
键盘输出的内容是:        }
键盘输出的内容是:    }
键盘输出的内容是:}

上面程序中创建了一个FileInputStream输入流,并使用System的setIn()方法将系统的标准输入重定向到该文件的输入流。运行上面的程序,程序不会等到用户输入,而是直接输出了RedirectIn.java文件的内容,这表明程序不再使用键盘作为标准输入,而是直接使用RedirectIn.java文件作为标准输入源。

posted @ 2020-04-26 21:41  小新和风间  阅读(206)  评论(0编辑  收藏  举报