запись в файл с помощью java и командной строки

#java #command-prompt

#java #командная строка

Вопрос:

когда я запускаю эту команду ffmpeg -i "C:usertest.wmv" >C:usertest.wmv_info.txt 2>amp;1 из командной строки, она работает, но когда я пытаюсь сделать то же самое из файла java, вызывая командную строку, она выполняется нормально, но не записывается в файл.

Есть идеи, почему?

мой java-код таков:

 public void getInfoThroughCommandLine(String sourceFilePath) {
    try {

        String infoFile = sourceFilePath "_info.txt";
        String command = "ffmpeg -i ""
                  sourceFilePath  "" >" infoFile " 2>amp;1";

        // Execute the command
        Process process = Runtime.getRuntime().exec("cmd.exe /c start "   command);

        logger.info("Executing getInfoThroughCommandLine command: "   command);


                    // Read the response
        BufferedReader input = new BufferedReader(new InputStreamReader(
                p.getInputStream()));
        BufferedReader error = new BufferedReader(new InputStreamReader(
                p.getErrorStream()));

        // Parse the input stream
        String line = input.readLine();
        System.out.println("ffmpeg execution of: "   sourceFilePath);
        while (line != null) {
            System.out.println("t***"   line);
            line = input.readLine();
        }

        // Parse the error stream
        line = error.readLine();
        System.out.println("Error Stream: "   sourceFilePath);
        while (line != null) {
                        //do somthing
                    }

    } catch (Exception e) {
        System.err.println(e);
    }
}
  

Комментарии:

1. Дайте нам какой-нибудь код, пожалуйста. Причин может быть миллион …

2. Покажите нам свою строку кода Java, которая пытается сделать то же самое.

Ответ №1:

Я полагаю, вы используете getRuntime().exec() для выполнения?

Если это так Process , то возвращаемый им объект будет тем, который дает вам доступ к входящим / исходящим потокам выполняемой вами команды. Просто прочитайте из него и напишите свой собственный файл.

— редактировать на основе обсуждения с помощью комментариев —

запуск в "cmd.exe /c start " command запустил бы программу в отдельном окне, и я предполагаю, что потоки процесса подключены к этому окну.

 C:Usersz000dgqd>start /?
Starts a separate window to run a specified program or command.
........
  

Попробуйте удалить его. Т.е.

     // Change this:
    Process process = Runtime.getRuntime().exec("cmd.exe /c start "   command);
    // to this
    Process process = Runtime.getRuntime().exec("cmd.exe /c "   command);
  

Комментарии:

1. я не могу этого сделать, так как мое приглашение cmd закрывается сразу после выполнения команды. Вероятно, я мог бы это сделать, если cmd остается открытым.

2. Поток будет иметь данные до тех пор, пока вы не прочитаете (или не удалите / не закроете) их. Пример в Google, попробуйте, а затем вернитесь, если у вас возникнут проблемы.

3. Я делаю это, и он возвращает пустую строку —

4. Что возвращает пустую строку? Опубликуйте код. Я надеюсь, что вы удалили перенаправление из команды.

5. о .. я не удалил перенаправление.. позвольте мне сделать это и посмотреть

Ответ №2:

> 2>amp;1 И — это операторы оболочки, которые сообщают оболочке перенаправить вывод вашей команды ( ffmpeg -i "C:usertest.wmv" ) в определенный файл ( C:usertest.wmv_info.txt ).

Эти операторы не работают в Java, в Java вы должны явно использовать стандартный вывод и стандартную ошибку (через Process#getInputStream() и Process#getErrorStream () соответственно — я знаю, что это кажется обратным) и записать выходные данные этих потоков в файл самостоятельно.

Комментарии:

1. 1: Оболочка — это больше, чем просто консольная версия запуска… запрос. Это больше, чем просто передача аргументов в исполняемые файлы.

Ответ №3:

Перенаправление обрабатывается командной оболочкой, то есть с помощью CMD.EXE — и если вы просто вводите строку выше Runtime.exec() , это не будет сделано. Вы можете либо организовать отправку этой командной строки CMD.EXE , что сложно сделать правильно, либо вы можете выполнить перенаправление самостоятельно на Java, прочитав выходные данные процесса и потоки ошибок и сохранив данные в файл.

Комментарии:

1. Я могу заставить эту командную строку перейти к cmd.exe . Он также вызывает команду, но просто не может выполнить запись в файл. Он даже создает файл.

2. Ваш код записывает вывод CMD.EXE к файлу, а не к выходным данным программы. Удалите CMD.EXE /c и просто запустите программу напрямую, затем оставьте запись потока включенной.

Ответ №4:

Может быть, вы могли бы записать эту команду в файл .bat и запустить его? Не самое чистое решение, но оно может сработать.