Przekierowanie wyjścia konsoli na ciąg znaków w Javie
Mam jedną funkcję, której Typ zwracania to VOID i wyświetla się bezpośrednio na konsoli.
Jednak potrzebuję tego wyjścia w łańcuchu, aby móc nad nim pracować.
Ponieważ nie mogę wprowadzić żadnych zmian z function z return type jest VOID więc muszę przekierować to Wyjście Do string.
Jak mogę przekierować go w Javie?
Istnieje wiele pytań dotyczących przekierowania stdout do string, ale przekierowują one tylko dane wejściowe pobrane od użytkownika, a nie Dane wyjściowe jakiejś funkcji...
2 answers
Jeśli funkcja drukuje do System.out
, możesz przechwycić to wyjście za pomocą metody System.setOut
, aby zmienić System.out
, aby przejść do PrintStream
dostarczonej przez Ciebie. Jeśli utworzysz PrintStream
podłączoną do ByteArrayOutputStream
, możesz przechwycić wyjście jako String
.
Przykład:
// 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());
Ten program wyświetla tylko jedną linię:
Here: Foofoofoo!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-03 05:42:43
Oto Klasa użytkowa o nazwie ConsoleOutputCapturer. Pozwala na wyjście, aby przejść do istniejącej konsoli jednak za sceną utrzymuje przechwytywanie tekstu wyjściowego. Możesz kontrolować, co przechwycić za pomocą metod start/stop. Innymi słowy wywołaj start, aby rozpocząć przechwytywanie wyjścia konsoli, a po zakończeniu przechwytywania możesz wywołać metodę stop, która zwraca wartość łańcuchową trzymającą wyjście konsoli dla okna czasowego między wywołaniami start-stop. Ta klasa nie jest bezpieczna dla wątków chociaż.
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();
}
}
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-27 06:38:44