Перенаправить вывод консоли в строку в java
У меня есть одна функция, чей тип возврата - VOID, и он печатает непосредственно на консоли.
Однако мне нужен этот вывод в строке, чтобы я мог работать над ним.
Поскольку я не могу вносить какие-либо изменения в функцию с возвращаемым типом, это VOID, поэтому мне нужно перенаправить этот вывод в строку.
Как я могу перенаправить его в JAVA?
Есть много вопросов относительно перенаправления stdout на строку, но они перенаправляют только входные данные, полученные от пользователя, а не вывод некоторых функций...
Ответы
Ответ 1
Если функция печатает на System.out
, вы можете записать этот вывод с помощью метода System.setOut
, чтобы изменить System.out
, чтобы перейти к PrintStream
, предоставленному вами. Если вы создаете PrintStream
, подключенный к ByteArrayOutputStream
, вы можете записать вывод как String
.
Пример:
// Create a stream to hold the output
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(baos);
// IMPORTANT: Save the old System.out!
PrintStream old = System.out;
// Tell Java to use your special stream
System.setOut(ps);
// Print some output: goes to your special stream
System.out.println("Foofoofoo!");
// Put things back
System.out.flush();
System.setOut(old);
// Show what happened
System.out.println("Here: " + baos.toString());
Эта программа печатает только одну строку:
Here: Foofoofoo!
Ответ 2
Вот класс утилиты с именем ConsoleOutputCapturer. Он позволяет выводить выход на существующую консоль, однако позади сцены сохраняется захват выходного текста. Вы можете управлять захватом с помощью методов старт/стоп. Другими словами, вызовите начало запуска захвата вывода консоли, и как только вы закончите захват, вы можете вызвать метод stop, который возвращает значение String, содержащее вывод консоли для временного окна между вызовами start-stop. Однако этот класс не является потокобезопасным.
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.util.Arrays;
import java.util.List;
public class ConsoleOutputCapturer {
private ByteArrayOutputStream baos;
private PrintStream previous;
private boolean capturing;
public void start() {
if (capturing) {
return;
}
capturing = true;
previous = System.out;
baos = new ByteArrayOutputStream();
OutputStream outputStreamCombiner =
new OutputStreamCombiner(Arrays.asList(previous, baos));
PrintStream custom = new PrintStream(outputStreamCombiner);
System.setOut(custom);
}
public String stop() {
if (!capturing) {
return "";
}
System.setOut(previous);
String capturedValue = baos.toString();
baos = null;
previous = null;
capturing = false;
return capturedValue;
}
private static class OutputStreamCombiner extends OutputStream {
private List<OutputStream> outputStreams;
public OutputStreamCombiner(List<OutputStream> outputStreams) {
this.outputStreams = outputStreams;
}
public void write(int b) throws IOException {
for (OutputStream os : outputStreams) {
os.write(b);
}
}
public void flush() throws IOException {
for (OutputStream os : outputStreams) {
os.flush();
}
}
public void close() throws IOException {
for (OutputStream os : outputStreams) {
os.close();
}
}
}
}