У меня есть настольное приложение, когда происходит зависание на несколько минут, есть поток, который отслеживает зависание и начинает сбрасывать трассировки стека всех потоков (это делается в собственном вызове, чтобы можно было вызвать JVM_DumpAllStacks
) во временный файл. Затем временный файл считывается как строка после собственного вызова и используется для входа в собственную структуру ведения журнала приложения.
Проблема в том, что после всего этого процесса я не могу восстановить System.out
в поток CONSOLE.
Это лучше объясняется в приведенном ниже коде.
public String getAllStackTraces() {
System.out.println("This will be printed in CONSOLE");
// This is NECESSARY for the jvm to dump stack traces in specific file which we are going to set in System.setOut call.
System.out.close();
File tempFile = File.createTempFile("threadDump",null,new File(System.getProperty("user.home")));
System.setOut(new PrintStream(new BufferedOutputStream(new FileOuptputStream(tempFile))));
//This native call dumps stack traces all threads to tempFile
callNativeMethodToDumpAllThreadStackTraces();
String stackTraces = readFileAsString(tempFile);
//close the tempFile PrintStream so as the next PrintStream object to set as 'out' and to take effect in the native side as well
System.out.close();
//Now I want to start printing in the CONSOLE again. How to do it again ?
//The below line does not work as FileDescriptor.out becomes invalid (i.e FileDescriptor.out.fd, handle = -1) after we do System.out.close() where out is PrintStream of console.
//System.setOut(new PrintStream(new BufferedOutputStream(new FileOuptputStream(FileDescriptor.out))));
PrintStream standardConsoleOutputStream = magicallyGetTheOutputStream() // How ???????????
System.setOut(standardConsoleOutputStream);
System.out.println("This will be printed in CONSOLE !ONLY! if we are able to get the new PrintStream of Console again magically");
}
Теперь, есть ли способ magicallyGetTheOutputStream
из консоли, чтобы снова начать печать в консоли?
Примечание. Приложение работает в Java 5 и 6.
System.out
консоли, потому что она закрыта, я должен каким-то образом снова получить новуюPrintStream
консоли, чтобы установить черезSystem.setOut
, и поэтому, где бы я ни делалSystem.out.println("something")
, он будет печатать в консоли - person Senthilkumar Annadurai   schedule 09.12.2015