当我从命令提示符运行此命令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);
}
}
答案 0 :(得分:2)
我假设您正在使用getRuntime().exec()
来执行?
如果是这样,它返回的Process
对象将允许您访问您执行的命令的输入/输出流。只需阅读它并编写自己的文件。
- 根据评论讨论进行编辑 -
从"cmd.exe /c start " + command
开始将在一个单独的窗口中启动该程序,我猜这个过程的流程附加到该窗口。
C:\Users\z000dgqd>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 :(得分:2)
>
和2>&1
是shell运算符,它告诉shell将命令输出(ffmpeg -i "C:\user\test.wmv"
)重定向到特定文件(C:\user\test.wmv_info.txt
)。
那些运算符在Java中不起作用,在Java中,你必须明确地采用标准输出和标准错误(分别通过Process#getInputStream()和Process#getErrorStream() - 我知道它似乎倒退了)并写入输出那些流来归档自己。
答案 2 :(得分:0)
重定向由命令shell处理 - 即CMD.EXE
- 如果您只是将上面的行提供给Runtime.exec()
,则无法完成。您可以安排将此命令行发送到CMD.EXE
- 这样做很复杂 - 或者您可以通过读取进程输出和错误流并将数据存储到文件来自己在Java中进行重定向
答案 3 :(得分:0)
也许您可以将该命令写入.bat文件并运行该命令?不是最干净的解决方案,但可能有效。