Gymterview
junior

Существует ли возможность перенаправить потоки стандартного ввода/вывода?

Да, класс System предоставляет статические методы для перенаправления стандартных потоков ввода/вывода.

Метод Назначение
System.setIn(InputStream) Перенаправление стандартного ввода (System.in)
System.setOut(PrintStream) Перенаправление стандартного вывода (System.out)
System.setErr(PrintStream) Перенаправление стандартного потока ошибок (System.err)

По умолчанию System.in связан с клавиатурой (stdin), System.out и System.err — с консолью (stdout, stderr). Перенаправление позволяет, например, записывать вывод программы в файл, читать ввод из файла или перехватывать вывод для тестирования.

Практические примеры

Пример
// Перенаправление вывода в файл
PrintStream fileOut = new PrintStream(new FileOutputStream("output.log"));
System.setOut(fileOut);
System.out.println("Это запишется в файл");

// Перенаправление ввода из файла
System.setIn(new FileInputStream("input.txt"));
Scanner scanner = new Scanner(System.in);
String line = scanner.nextLine(); // читает из файла

// Перехват вывода для тестирования
ByteArrayOutputStream baos = new ByteArrayOutputStream();
System.setOut(new PrintStream(baos));
myMethod(); // вызов тестируемого метода
String output = baos.toString();

На практике перенаправление System.out/System.err используется редко — для логирования существуют специализированные фреймворки (SLF4J, Logback). Однако перенаправление бывает полезно в тестах и утилитах командной строки.

На собеседовании: назовите три метода setIn(), setOut(), setErr(). Приведите пример использования — перехват вывода для тестирования.