запись в файл с использованием Java и командной строки - PullRequest
1 голос
/ 20 октября 2011

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

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

мой код Java:

public void getInfoThroughCommandLine(String sourceFilePath) {
    try {

        String infoFile = sourceFilePath+"_info.txt";
        String command = "ffmpeg -i \""
                + sourceFilePath +"\" >"+infoFile+" 2>&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);
    }
}

Ответы [ 4 ]

2 голосов
/ 20 октября 2011

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

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

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

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

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

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

    // Change this:
    Process process = Runtime.getRuntime().exec("cmd.exe /c start " + command);
    // to this
    Process process = Runtime.getRuntime().exec("cmd.exe /c " + command);
2 голосов
/ 20 октября 2011

> и 2>&1 - это операторы оболочки, которые говорят оболочке перенаправить вывод вашей команды (ffmpeg -i "C:\user\test.wmv") в определенный файл (C:\user\test.wmv_info.txt).

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

0 голосов
/ 20 октября 2011

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

0 голосов
/ 20 октября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...