Java可通过System.setIn()和System.setOut()将标准输入输出重定向到文件:setOut()用PrintStream包装FileOutputStream实现输出重定向,setIn()用FileInputStream替换System.in实现输入重定向;需注意全局生效、异常处理、资源关闭及原始流保存恢复。

Java 中可以通过 System.setIn() 和 System.setOut() 方法,将控制台的标准输入(System.in)和标准输出(System.out)重定向到文件。本质是替换系统默认的输入流和输出流对象,换成基于文件的 FileInputStream 或 PrintStream。
重定向标准输出(System.out)到文件
使用 PrintStream 包装一个文件输出流,再通过 System.setOut() 设置:
- 创建
FileOutputStream指向目标文件(如"output.txt") - 用该流构造
PrintStream(建议传入true启用自动刷新) - 调用
System.setOut(printStream) - 之后所有
System.out.println()都会写入该文件,而非控制台
示例代码:
PrintStream out = new PrintStream(new FileOutputStream("output.txt"), true);System.setOut(out);
System.out.println("这行会写入文件");
重定向标准输入(System.in)从文件读取
用 FileInputStream 替换 System.in,后续 Scanner(System.in) 或 BufferedReader 就会从文件读数据:
立即学习“Java免费学习笔记(深入)”;
- 创建
FileInputStream打开源文件(如"input.txt") - 调用
System.setIn(fileInputStream) - 注意:原
System.in被替换后,无法再从键盘读取,除非恢复
示例代码:
System.setIn(new FileInputStream("input.txt"));Scanner scanner = new Scanner(System.in);
String line = scanner.nextLine(); // 从 input.txt 读第一行
注意事项与恢复原始流
重定向是全局生效的,影响整个 JVM 的标准 I/O 行为,需谨慎使用:
- 重定向前可先保存原始流(如
InputStream originalIn = System.in;),便于后续恢复 - 文件操作可能抛出
FileNotFoundException,需捕获或声明异常 - 使用完毕建议关闭流(尤其是输出流),避免资源泄漏;但
System.out关闭后会导致后续输出失败,通常不主动 close - 若需临时重定向,可在 try-with-resources 或 finally 块中恢复原始流
简单封装工具方法(可选)
为便于复用,可封装重定向和恢复逻辑:
public static void redirectOutputToFile(String filename) throws IOException {System.setOut(new PrintStream(new FileOutputStream(filename), true));
}
public static void restoreOutput() {
System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out)));
}
类似地可封装输入重定向与恢复。


















