Вот класс утилиты 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();
}
}
}
}
Функция parent
возвращает другую функцию. Эта функция должна вызываться для вступления в силу:
print(parent()())
Или, чтобы подчеркнуть последовательность вызова:
print((parent())()
Здесь вам нужно вернуть son ()
def parent(x="Hello"):
text = x
def son():
print(text)
return son # return son()
print(parent())
Здесь вы получите результат разницы, потому что ссылаетесь на akin ()
def parent(x="Hello"):
text = x
def son():
print(text)
return son
akin = parent()
akin() # print(akin) will get the same output of first program
Разница в том, что каждая функция имеет адрес памяти, если вы ссылаетесь на функцию без скобок (), вы получите адрес этой функции. Таким образом, в вашей первой программе вы возвращаете адрес памяти функции, чтобы вы могли получить доступ к содержимому с помощью parent () () или вернуть фактическое значение из функции вместо возврата адреса