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(). Приведите пример использования — перехват вывода для тестирования.