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

14

我正在尝试找出如何打开系统首选编辑器来编辑指定文件。

例如,我们编写了一个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资源管理器中的“使用...”)。您知道吗?


其他建议:我能否在Windows和Linux中强制出现“应用程序选择”窗口,就像在Mac中一样?例如,当您尝试打开文件时,会要求您从系统预定义的选择列表中选择应用程序吗?(类似于Windows资源管理器中的“使用...”)。你知道吗? - Arturas Smorgun
5个回答

10

看起来如果你不能使用java.awt.Desktop,你必须区分操作系统:

Windows:

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

Linux:

edit <file.ext>

Mac:

open <file.ext>

希望有所帮助。显然,这并不是非常可移植的...


这些是控制台命令,我应该写入Runtime.getRuntime().exec()函数中,对吗? - Arturas Smorgun
请注意,OpenAs_RunDLL是未记录的,并且并不总是有效。 - Harry Johnston
这个解决方案帮助我打开了其他类型的链接:ms-word:ofe|u|http://10.0.162.75:8081/alfresco/webdav/Myfiles/file_example.docx - Ruslan López

7
检查 java.awt.Desktop 对象。在您的情况下,您想调用edit()
如果您想确保给定平台支持此调用,则可以执行以下操作(我尚未测试此代码):
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;
}

我确实知道,在Ubuntu上edit()不起作用。但是这个功能对我来说是必需的。如果edit()不受支持,你知道我应该怎么做吗? - Arturas Smorgun

3

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

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

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


谢谢,我会尝试的。这对我非常有用,因为现在我只能在Ubuntu和Linux上测试我的代码,不知道在Mac上会怎样。 :) - Arturas Smorgun

1

对于JavaFX应用程序,我们可以使用HostServices。这篇文章介绍了如何使用HostServices。这应该在Ubuntu(已测试)/Windows(未测试)和Mac(未测试)上都适用。

import java.io.File;
import java.io.IOException;
public class App extends Application {
}

File file = new File("/your/file/path");
HostServices hostServices = getHostServices();
hostServices.showDocument(file.getAbsolutePath());

getHostServices()是JavaFX应用程序类的一个方法。


1
这将在Windows中运行。
Runtime.getRuntime().exec( "CMD /C START filename.ext " );

不行,它不会的 ;p - westman379
在我的 Windows 10 Pro 上运行正常。 - Ilya Serbis
2
将文件名放在引号中是值得的,这样可以使语句更安全(以防文件名或路径中包含空格):Runtime.getRuntime().exec("cmd /c start \"\" " + file.absolutePath + "\""); - Ilya Serbis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接