Рейтинг:
10
Osmund Francis
Одним из способов было бы использовать Java™ Runtime
класс для создания собственного экземпляра консоли. Это позволит вам получить всю информацию, которая обычно выводится в консоли.
В следующем примере показано, как получить Runtime
объект, получить Process
результат выполнения команды и способ управления потоками для процесса, а также потоками для файла(ов).
Данный пример является примером отображения записей каталога (Microsoft™ Windows®).
package codeproject.console;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class SampleProgram {
public static boolean isAlive(Process process) {
try {
process.exitValue();
return false;
}
catch (IllegalThreadStateException e) {
return true;
}
}
public static void main(String[] args) {
Runtime runtime = Runtime.getRuntime();
Process process;
int value;
try {
process = runtime.exec("cmd");
}
catch (IOException exception) {
exception.printStackTrace();
return;
}
try (FileOutputStream fstdc = new FileOutputStream("output.log");
FileOutputStream ferrc = new FileOutputStream("error.log");
OutputStream outc = process.getOutputStream();
InputStream inc = process.getInputStream();
InputStream errc = process.getErrorStream()) {
outc.write("dir\r\n".getBytes());
outc.flush();
outc.write("exit\r\n".getBytes());
outc.flush();
while (isAlive(process) == true) {
if (inc.available() == 0 && errc.available() == 0) {
try {
Thread.sleep(100);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
if (inc.available() > 0) {
while (inc.available() > 0) {
value = inc.read();
System.out.print((char) value);
fstdc.write((char) value);
}
}
if (errc.available() > 0) {
while (errc.available() > 0) {
value = errc.read();
System.err.print((char) value);
ferrc.write((char) value);
}
}
}
}
catch (IOException exception) {
exception.printStackTrace();
}
}
}
Для простого протоколирования отметок времени с базовой поддержкой пользовательского ввода:
package codeproject.console;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Calendar;
public class SampleTimeLogProgram {
/** Returns the date-time stamp */
public static String timeStamp() {
return String.format("%1$tY-%1$tm-%1$td %1$tH:%1$tM", Calendar.getInstance());
}
/** Returns true if process is still alive, false otherwise. */
public static boolean isAlive(Process process) {
try {
process.exitValue();
return false;
}
catch (IllegalThreadStateException e) {
return true;
}
}
public static void main(String[] args) {
Runtime runtime = Runtime.getRuntime();
Process process;
InputStream userInput = System.in;
int value;
try {
process = runtime.exec("cmd");
}
catch (IOException exception) {
exception.printStackTrace();
return;
}
try (FileOutputStream fstdc = new FileOutputStream("output.log", true);
FileOutputStream ferrc = new FileOutputStream("error.log", true);
OutputStream outc = process.getOutputStream();
InputStream inc = process.getInputStream();
InputStream errc = process.getErrorStream()) {
String stamp = timeStamp();
fstdc.write(("\r\n" + stamp + " ").getBytes());
ferrc.write(("\r\n" + stamp + " ").getBytes());
System.out.print(stamp + " ");
while (isAlive(process) == true) {
if (inc.available() == 0 && errc.available() == 0) {
if (userInput != null && (userInput.available() > 0)) {
value = userInput.read();
outc.write((char) value);
outc.flush();
}
else {
try {
Thread.sleep(100);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
if (inc.available() > 0) {
while (inc.available() > 0) {
value = inc.read();
fstdc.write((char) value);
System.out.print((char) value);
if (value == '\n') {
stamp = timeStamp();
fstdc.write((stamp + " ").getBytes());
System.out.print(stamp + " ");
}
System.out.flush();
}
}
if (errc.available() > 0) {
while (errc.available() > 0) {
value = errc.read();
ferrc.write((char) value);
System.err.print((char) value);
if (value == '\n') {
stamp = timeStamp();
ferrc.write((stamp + " ").getBytes());
System.err.print(stamp + " ");
}
System.err.flush();
}
}
}
}
catch (IOException exception) {
exception.printStackTrace();
}
}
}
Member 10885013
Это великий Осмунд, сэр. И еще одно: если мне нужно отфильтровать последние часовые данные из файлов журнала, сгенерированных с консоли CMD, то что мне делать? Я написал программу, которая будет читать файлы журнала в обратном порядке, но я не получаю способа проанализировать данные за последний час.
Osmund Francis
Ведение журнала с возможностью фильтрации - задача не из простых.
Я обновил свое решение с помощью фрагмента кода, который просто добавляет метку даты и времени каждый раз, когда обнаруживается символ новой строки.
Member 10885013
Код
while (process.isAlive() == true) {
выдает ошибку компиляции, так как "метод isAlive() не определен для процесса типа"
Osmund Francis
Я приношу свои извинения, но ... isAlive()
метод-это функция Java™ 8. Я обновлю свое решение.
Member 10885013
Спасибо за ваше ценное предложение.