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("
");
//判断是否华友下一个输入项
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("
");
键盘输出的内容是: //判断是否华友下一个输入项
键盘输出的内容是: while(sc.hasNext())
键盘输出的内容是: {
键盘输出的内容是: //输出输入项:
键盘输出的内容是: System.out.println("键盘输出的内容是:"+sc.next());
键盘输出的内容是: }
键盘输出的内容是: }
键盘输出的内容是: catch (IOException ioe)
键盘输出的内容是: {
键盘输出的内容是: ioe.printStackTrace();
键盘输出的内容是: }
键盘输出的内容是: }
键盘输出的内容是:}
上面程序中创建了一个FileInputStream输入流,并使用System的setIn()方法将系统的标准输入重定向到该文件的输入流。运行上面的程序,程序不会等到用户输入,而是直接输出了RedirectIn.java文件的内容,这表明程序不再使用键盘作为标准输入,而是直接使用RedirectIn.java文件作为标准输入源。