使用ProcessBuilder时出现问题

时间:2012-02-11 10:03:49

标签: java runtime.exec processbuilder

以下代码在记事本中打开状态非常好:

import java.util.*;
class test
{
public static void main(String args[])
{
    try{
    ProcessBuilder pb=new ProcessBuilder("notepad","F:/status");
    pb.start();
    }catch(Exception e)
    {
        System.out.println(e);
    }
}
}

以下代码没有播放这首歌:

import java.util.*;
class test
{
public static void main(String args[])
{
    try{
    ProcessBuilder pb=new ProcessBuilder("C:/Program Files (x86)/VideoLAN/VLC/vlc","D:/02 Tu Jaane Na");
    pb.start();
    }catch(Exception e)
    {
        System.out.println(e);
    }
}
}

2 个答案:

答案 0 :(得分:2)

对于1.6+代码,请改用Desktop.open(File)


当然,在致电之前要做的明智之举就是检查File.exists()

OTOH,Desktop.open(File)抛出了一系列方便的例外,包括:

  • NullPointerException - 如果文件为空
  • IllegalArgumentException - 如果指定的文件不存在
  • UnsupportedOperationException - 如果当前平台不支持Desktop.Action.OPEN操作
  • IOException - 如果指定的文件没有关联的应用程序或关联的应用程序无法启动

如果处理得当,该例外将表明当前的问题。


另外,Desktop类设计为跨平台的,并且将处理为其定义关联的任何文件类型。从这个意义上说,这比使用Process

更有用

答案 1 :(得分:2)

我认为问题在于您忽略了您尝试打开的文件filename extensions这一事实。

Windows资源管理器默认情况下不显示文件扩展名 - 这可能是您不知道它们存在的原因。

记事本在您的第一个示例中工作的原因是记事本会自动为其文件名参数添加.txt扩展名,以防您自己没有提供。实际上,正在打开的文件不是status而是status.txt

VLC没有这种“高级”功能,因为它没有专门设计的文件扩展名。

因此,您需要查找dir命令输出并将完整文件名添加为参数。

如果这是真正的问题 - 您可能希望修改Windows资源管理器设置以显示文件扩展名:

enter image description here

或者,哪个更好,切换到程序员友好的操作系统:)