15.5 重定向标准输入输出

15.5 重定向标准输入 输出

第7章介绍过,Java的标准输入输出分别通过System.inSystem.out来代表,在默认情况下它们分别代表键盘和显示器。

  • 当程序通过System.in来获取输入时,实际上是从键盘读取输入;
  • 当程序试图通过System.out执行输出时,程序总是输出到屏幕。

System类重定向标准输入输出的方法

System类里提供了如下三个重定向标准输入输出的方法

方法 描述
static void setErr(PrintStream err) 重定向“标准”错误输出流。
static void setIn(InputStream in) 重定向“标准”输入流。
static void setOut(PrintStream out) 重定向“标准”输出流。

程序示例 输出重定向到文件中

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.io.*;

public class RedirectOut {
public static void main(String[] args) {
try (
// 一次性创建PrintStream输出流
PrintStream ps = new PrintStream(new FileOutputStream("out.txt"))) {
// 将标准输出重定向到ps输出流
System.setOut(ps);
// 向标准输出输出一个字符串
System.out.println("普通字符串");
// 向标准输出输出一个对象
System.out.println(new RedirectOut());
} catch (IOException ex) {
ex.printStackTrace();
}
}
}

上面程序中创建了一个PrintStream输出流,并将系统的标准输出重定向到该PrintStream输出流。运行上面程序时将看不到任何输出——这意味着标准输出不再输出到屏幕,而是输出到out.txt文件,运行结束后,打开系统当前路径下的out.txt文件,即可看到文件里的内容,正好与程序中的输出一致。

程序示例 输入重定向到文件

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.util.*;
import java.io.*;

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

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