Сброс стандартного потока вывода
Я знаю, что в Java есть функция для установки стандартного выходного потока на любое пользовательское значение, используя System.setOut
способ..
Но есть ли способ сбросить стандартный вывод на тот, который был сохранен ранее, или тот, который является стандартным выводом?
3 ответа
Вы можете получить дескриптор файла для стандартного через FileDescriptor.out
, Чтобы сбросить стандартный вывод на консоль, вы делаете
System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out)));
Другой способ - просто удерживать исходный объект, как показано ниже:
PrintStream stdout = System.out;
System.setOut(new PrintStream(logFile));
// ...
System.setOut(stdout); // reset to standard output
Это старый вопрос, но он все время появляется в поиске Google, и я хотел его исправить. Вы можете получить его, используя FileDescriptor
учебный класс. призвание new PrintStream(new FileOutputStream(FileDescriptor.out)))
должен дать вам что-то, что печатает на стандартный вывод.
import java.io.FileDescriptor;
import java.io.FileOutputStream;
import java.io.PrintStream;
public static void main(String [] args) {
System.err.println("error.");
System.out.println("out.");
System.setOut(System.err);
System.out.println("error?");
System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out)));
System.out.println("out?");
}
@Aioobe в моем тесте.
package com.threads;
public class threadsDemo {
public static void main(String[] args) throws InterruptedException {
int size = 5;
myThread[] ths = new myThread[size];
for (int i = 0; i < size; i++) {
ths[i] = (new myThread("" + i, System.out));
ths[i].start();
}
for (int i = 0; i < size; i++) {
ths[i].join();
}
}
}
package com.threads;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
public class myThread extends Thread {
private String name;
private PrintStream oldPrintStream;
private ByteArrayOutputStream bos = new ByteArrayOutputStream();
public myThread(String name, PrintStream out) {
this.name = name;
this.oldPrintStream = out;
System.setOut(new PrintStream(bos));
}
@Override
public void run() {
System.out.println("run, out:name" + name + ",tid:" + Thread.currentThread().getId());
System.err.println("run, err:name" + name + ",tid:" + Thread.currentThread().getId());
try {
Thread.sleep((long) (Math.random() * 1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
System.setOut(oldPrintStream);
// System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out)));
System.out.println("in bos:" + bos.toString());
System.out.println("exit,out:name" + name + ",tid:" + Thread.currentThread().getId());
System.err.println("exit,err:name" + name + ",tid:" + Thread.currentThread().getId());
}
}
это не работает правильно. попробовал и получил. правильный путь:
System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out)));