Member 10885013 Ответов: 1

Как распечатать выходные данные консоли cmd в txt-файл с помощью java?


У меня есть сервер, который работает через CMD и генерирует данные живых журналов. Как скопировать эти данные из консоли CMD в файл журнала, помещенный на локальный диск, с помощью java?


Пожалуйста помочь.

[no name]

Перенаправьте выходные данные в файл журнала.

Member 10885013

Я имел в виду, как мне это сделать с помощью java-программы.

Sergey Alexandrovich Kryukov

Почему?
—СА

Sergey Alexandrovich Kryukov

Почему? Почему бы не перенаправить вывод консоли в файл в первую очередь?
—СА

Member 10885013

Потому что моя консоль CMD-это сервер в Брисбене. Я не могу изменить это.

Richard MacCutchan

Если у вас нет доступа к серверу через telnet или какой-либо веб-сервис, вы вряд ли сможете что-либо сделать.

lesforever

Какой тип сервера идет речь? Почему бы не использовать log4j для записи в файл?

Member 10885013

Это сервер моей компании, который управляет шахтами. И я не знаю, как реализовать log4j, сэр. И более того, как я буду анализировать данные за последний час из сгенерированного файла журнала? Пожалуйста помочь. Я застрял в этой ситуации.

1 Ответов

Рейтинг:
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

Спасибо за ваше ценное предложение.