在ubuntu(linux)上从java打开一个带有Desktop.open()的路径

时间:2012-03-13 21:17:01

标签: java ubuntu path desktop

从我用java编写的应用程序中,我想使用操作系统文件资源管理器打开一个文件夹。

我使用Desktop.open(新文件(路径))

这在Windows上工作正常,但在ubuntu 11.10(linux)上它不起作用。 使用Desktop.open打开文件在ubuntu和windows上都有效。

使用介于两者之间的步骤: 文件fPath =新文件(fPath) 并使用fPath.exists()和fPath.isDirectory()测试它们都给出了真的。

使用Desktop.open(新文件(路径))给出了这个例外:

java.io.IOException: Failed to show URI:file:/and/here/the/path/I/use/
at sun.awt.X11.XDesktopPeer.launch(Unknown Source)
at sun.awt.X11.XDesktopPeer.open(Unknown Source)
at java.awt.Desktop.open(Unknown Source)

我还没能在苹果电脑上测试这个,但我希望Desktop.open(新文件(路径))与系统无关......

顺便说一下,完整的代码:

    Desktop desktop = null;
    // Before more Desktop API is used, first check
    // whether the API is supported by this particular
    // virtual machine (VM) on this particular host.
    if (!Desktop.isDesktopSupported()) {
        // show Error
        return;
    }
    desktop = Desktop.getDesktop();
    String path = "here the path ";
    // by the way: I use System.getProperty("file.separator") as file seperator
    try {
        File fPath=new File(path);
        if(!fPath.exists()){
            // show Error
            return;

        }
        if(!fPath.isDirectory()){
            // show Error
            return;

        }
        desktop.open(new File(path));
    } catch (IOException e) {
        log.severe(e.getMessage());
        e.printStackTrace();
        // show Error
        return;
    }

一些额外信息: 操作系统:Linux(3.0.0-16-generic - amd64)

Java:1.6.0_30-b12

Java home:/opt/java/64/jre1.6.0_30

6 个答案:

答案 0 :(得分:2)

我有同样的问题。但是在我的情况下是Ubuntu 18.04和Java 1.8.0_161-b12 在Windows 10中,一切正常。但是在Ubuntu上

Desktop.getDesktop().open(new file) 

程序停止响应。 我决定将调用包装在执行程序中:

private ExecutorService executorService; 
   BasicThreadFactory factory = new BasicThreadFactory.Builder()
            .namingPattern("YourPatternIndeficator")
            .build();
    executorService = Executors.newSingleThreadExecutor(factory);
if (Desktop.isDesktopSupported()) {
        File myFile = new File(path);
        executorService.execute(() -> {
            try {
                Desktop.getDesktop().open(myFile);
            } catch (IOException e) {
                e.printStackTrace();
            }
        });

    }

答案 1 :(得分:1)

我在Mint 13上遇到了同样的问题。据我所知,对于打开目录的mime处理的更改破坏了java Desktop api。我能够通过编辑

来解决这个问题
~/.local/share/applications/defaults.list

并添加此行

x-directory/normal=nautilus.desktop

我正在使用java版“1.7.0_05”运行Mint 13 Cinnamon

答案 2 :(得分:0)

我无法确认错误。我拿了你的代码并围绕它构建了一个main方法,一切都按预期工作。我并不完全知道默认应用程序的设置位置(在我的情况下,PCMan是打开的而不是通常的Nautilus,但它最终应该达到目的)。

java.awt.Desktop.open doesn’t work with PDF files?处,我发现了一个指向an issue in Suns (Oracles) bug tracker的链接,指出使用AWT打开文件的方法即使在Windows上也不可靠。也许您应该考虑打开此类应用程序的其他方法。此外,AWT很快就会弃用。

如果您在应用程序中使用SWT,则可以使用org.eclipse.swt.program.Program

答案 3 :(得分:0)

我遇到了同样的问题,并决定给Java 7一个旋转。我在Ubuntu 11.10_x64上运行java版“1.7.0_147-icedtea”,现在可以非常开心地在Nautilus中打开文件位置。

答案 4 :(得分:0)

我在Linux Mint上遇到了同样的问题(而不是在Windows中)。

该链接帮助了我: Troubles with java.awt.Desktop browse() method

这似乎适用于我的Linux Mint-KDE。 我改变了行

Desktop.getDesktop().desktop.open(new File("/home/user/mypath"));// this throws IOException: Failed to show URI (except in Windows)

Desktop.getDesktop().desktop.open(new File("///home/user/mypath"));// this launches Dolphin

Desktop.getDesktop().desktop.open(new File(new URI("file:///home/user/mypath").getPath()));// this launches Dolphin

Dolphin是用我的文件夹" mypath"发布的。但是我找不到在我的Linux上打开像pdf或txt这样的文件的方法,而它在Windows上使用第一个代码。

(Java 1.8.0_25,Netbeans 8.02,Linux Mint 12 KDE)

答案 5 :(得分:0)

我遇到Kubuntu 18.04和Java 11的问题。

sudo apt install libgnome2-0 gvfs

有关详细信息,请参见https://bugs.launchpad.net/ubuntu/+source/openjdk-8/+bug/1574879/comments/5。 java.awt.Desktop与Gnome一起使用,而不与KDE一起使用。