Java Runtime.getRuntime().exec()不工作

Java Runtime.getRuntime().exec()不工作,java,windows,cmd,Java,Windows,Cmd,我在尝试用Java启动视频文件时有一种奇怪的行为 代码如下: File f = new File("Y:\AAA\DVD2013_GDL_(SEP)\Videos\0005000po8jy.mpg"); String[] cmd = new String[3]; cmd[0] = "cmd.exe"; cmd[1] = "/C"; cmd[2] = "\""+f.getAbsolutePath()+"\""; Runtime.getRuntime().exec(cmd); 由于某些原因,视频没

我在尝试用Java启动视频文件时有一种奇怪的行为

代码如下:

File f = new File("Y:\AAA\DVD2013_GDL_(SEP)\Videos\0005000po8jy.mpg");
String[] cmd = new String[3];
cmd[0] = "cmd.exe";
cmd[1] = "/C";
cmd[2] = "\""+f.getAbsolutePath()+"\"";
Runtime.getRuntime().exec(cmd);
由于某些原因,视频没有启动。将路径粘贴到cmd时,文件将毫无问题地启动

现在,当我将路径更改为:

Y:\AAA\DVD2013_GDL_(SEP)\Video Dateien\0005000po8jy.mpg
上述代码有效。请注意,我只是将文件夹名称从“Videos”更改为“Video Dateien”

是否有人有想法,为什么我的代码在描述的情况下不工作?顺便说一句,我使用的是Java1.7

编辑:我不例外,也没有冻结或其他奇怪的行为

谢谢你的帮助,
klib

使用
Runtime.getRuntime().exec()
只能执行
可执行文件
文件(如
cmd
bat
exe
等)。
mpg
不是可执行文件,
mpg
文件被另一个工具读取。
你应该用另一种方式打开它

Descktop.getDesktop().open(new File("Y:\AAA\DVD2013_GDL_(SEP)\Videos\0005000po8jy.mpg"))

。此外,现在您应该更喜欢ProcessBuilder,因为它更易于使用。

您需要启动播放器并将文件路径作为参数传递给它。例如

    Runtime.getRuntime().exec("C:\\Windows\\default_player_name.exe -param_name D:\\file_name.mpg");
阅读播放器手册,了解您想要的启动(输入时如何获取文件)


另外还有一个好主意:创建“.bat”(如果您为windows编写代码)脚本,以便使用参数执行所需的程序,下一次执行此批处理文件。

当您将文件夹名称从
Videos
更改为
videodateen
时,它工作的事实似乎表明基础文件夹名称与显示的名称不同

底层目录名为
Video-Dateien
,而不是
Videos
。该目录中有一个
desktop.ini
文件,它将目录的本地化名称设置为
Videos

CMD和java都不理解文件夹的本地化名称,它只是一个资源管理器的概念

当您使用
Desktop.open
时,它将打开的内容传递给
explorer
,explorer可以理解并翻译本地化的目录名


一般来说,我不会将本地化文件名放入这样的应用程序中,因为这只是自找麻烦。

您尝试过吗?Desktop.getDesktop.open()有效!但这有什么缺点吗?是否存在代码无法启动文件的其他情况?我仍然无法理解为什么Runtime.exec()在所描述的示例中失败。你能重现所描述的行为吗?主要的缺点是,它(
桌面
)可能在所有平台上都不受支持,但由于你正在执行
cmd
,你已经以任何方式缩小了自己的范围,你无法控制将使用什么应用程序打开文件,由于它只是尝试使用系统配置的内容……您知道如何使用Runtime.exec()吗?它有很多陷阱,所以不像看上去那么容易。实际上我只是在维护遗留代码。这不是我自己写的。因此,我必须确保,从Runtime.exec()切换到Desktop.getDesktop.open()不会中断其他一些文件(或文件类型)的调用过程。我可以调用cmd.exe以使用默认播放器启动mpg(就像我做的那样)。我知道使用Desktop.getDesktop.open()可能是更好的选择,但我仍然不知道为什么Runtime.exec()对某些文件失败,而对其他文件有效。这不是一个真正的选项,因为我不知道我们的客户使用的是哪种播放器。所需的行为是启动默认播放机时使用文件.Hmm。。。但正如我在问题中所写的那样,当粘贴到命令行的路径时,这两个示例都适用。它只在从Java调用cmd时失败。您从未提到您正在使用的windows版本,这确实会对行为产生影响;随着windows版本的更新,规则也会发生变化——它在windows 8.1上的本地化路径下根本不起作用(目前我没有一个较旧的系统来测试它)。经验法则是使用文件的正确路径,而不是本地化/虚拟化路径。我知道本地化路径会带来麻烦。但为什么你认为我的问题与本地化路径有关?所有路径都是正确的路径。