有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何为给定文件打开用户系统首选编辑器?

我正试图找出如何打开给定文件的系统首选编辑器

比如说,我们有一个用Java编写的文件管理器。用户转到文件夹并查看文件列表。例如,有一个文件Icon.jpg。用户双击文件名,文件在系统首选编辑器(即Gimp)中打开。主要问题是——如何做到这一点

我们可以做Runtime.getRuntime().exec("something file"),但这样您应该知道在用户环境中哪个程序是首选的。但是怎么做呢

我们也可以执行Desktop.getDesktop().edit(File file),但这样我们无法跟踪进程,也无法知道该子进程是否已关闭。其他问题-函数在linux上不起作用(至少在Ubuntu 8.10上不起作用)。还有Desktop.getDesktop().open(File file),但它强制打开文件查看器,而不是该文件类型的系统查看器

我整个星期都在寻找解决方案,但没有找到任何合适的通用解决方案。你知道解决这个问题的其他方法吗?对于我的项目来说,如果它能在Windows+Linux+Mac上运行就足够了

谢谢你的回答和建议

于2009-02-08 23:04编辑

其他建议:我是否可以在Windows和Linux中强制设置“应用程序选择”窗口,就像在Mac中使用“打开文件”一样?例如,当您试图打开文件时,系统会要求您从系统首选应用程序列表中选择应用程序?(类似于“打开…”在Windows资源管理器中)。你知道吗


共 (4) 个答案

  1. # 1 楼答案

    这不是跨平台的,但在Mac OS X上你可以做到

    Runtime.getRuntime().exec("open filename");
    

    open(1)可执行文件使用LaunchServices选择要执行的正确程序,然后使用该程序打开名为filename的文件

  2. # 2 楼答案

    查看java.awt.Desktop对象。在您的情况下,您希望调用^{}

    如果希望确保给定平台支持此调用,则可以执行以下操作(我尚未测试此代码):

    public boolean editFile(final File file) {
      if (!Desktop.isDesktopSupported()) {
        return false;
      }
    
      Desktop desktop = Desktop.getDesktop();
      if (!desktop.isSupported(Desktop.Action.EDIT)) {
        return false;
      }
    
      try {
        desktop.edit(file);
      } catch (IOException e) {
        // Log an error
        return false;
      }
    
      return true;
    }
    
  3. # 3 楼答案

    似乎如果你不能使用java.awt.Desktop,你必须区分操作系统: 窗口:

    RUNDLL32.EXE SHELL32.DLL,OpenAs_RunDLL <file.ext>
    

    Linux:

    edit <file.ext>
    

    Mac:

    open <file.ext>
    

    嗯。显然,这不是很方便携带

  4. # 4 楼答案

    这将在windows中工作

    Runtime.getRuntime().exec( "CMD /C START filename.ext " );