如何通过桌面使用Java代码打开文件扩展名不受支持的文件?

如何通过桌面使用Java代码打开文件扩展名不受支持的文件?,java,linux,windows,Java,Linux,Windows,我有一个程序,它读取文件路径或URI,并通过桌面启动任何文件或URI。我遇到的问题是不支持的文件扩展名。奇怪的是,当它无法打开文件时,我得到的错误不是我所期望的。错误为 java.io.IOException: Failed to open file:/C:/Users/angel/Desktop/test.test. Error message: Access is denied. at sun.awt.windows.WDesktopPeer.ShellExecute(WDesktopPe

我有一个程序,它读取文件路径或URI,并通过桌面启动任何文件或URI。我遇到的问题是不支持的文件扩展名。奇怪的是,当它无法打开文件时,我得到的错误不是我所期望的。错误为

java.io.IOException: Failed to open file:/C:/Users/angel/Desktop/test.test. Error message: Access is denied.

at sun.awt.windows.WDesktopPeer.ShellExecute(WDesktopPeer.java:77)
at sun.awt.windows.WDesktopPeer.open(WDesktopPeer.java:54)
at java.awt.Desktop.open(Desktop.java:272)
at desktopopenfile.DesktopOpenFile.openFile(DesktopOpenFile.java:24)
at desktopopenfile.DesktopOpenFile.main(DesktopOpenFile.java:15)
我认为错误更多的是文件扩展名不受支持。我可以在另一个程序中验证文件扩展名,该程序为数据库提供支持,但我想知道是否有一种方法允许用户选择一个应用程序来打开不受支持的文件

我的理想解决方案类似于当您尝试在windows中打开不受支持的文件时,它会询问您希望使用什么程序打开它或搜索web。如果我用下面的代码得到了这个选项,我会很好。我的想法是希望能够通过URI或文件路径打开任何文件类型。目前,我的代码使用.pdf、.xml、.pptx和word文件。任何建议都会很棒

 /**
 * Checks if a file or URI is included in the message and if so opens it via
 * the Desktop
 */
private void checkMessage() {
    // check to make sure the data model and time model are set
    if (dataModel == null || timeModel == null) {
        return;
    }

    int selectedIndex = jTable.convertRowIndexToModel(jTable.getSelectedRow());
    if (selectedIndex != -1) {
        IntData intData = dataModel.getData(selectedIndex);
        IceData iceData = ((IceData) intData);
        if (iceData != null) {
            if (iceData.getMessage() != null) {
                String message = iceData.getMessage();
                if (message != null) {
                    if (message.contains("file://")) {
                        String path = message.substring(message.lastIndexOf("/") + 1, message.indexOf(" ", message.lastIndexOf("/")));
                        openFile(path);
                    }
                    else if (message.contains("uri://")) {
                        try {
                            URI uri = new URI(message.substring(message.indexOf("/") + 2, message.indexOf(" ", message.lastIndexOf("/"))));
                            openURI(uri);
                        }
                        catch (IOException | URISyntaxException ex) {
                            Logger.getLogger(IceDataListPanel.class.getName()).log(Level.SEVERE, "Failed to open URI: {0}", ex.getMessage());
                        }
                    }
                }
            }
        }
    }
}

/**
 * Opens the file given the path
 *
 * @param path to the file
 */
private void openFile(String path) {
    try {
        File file = new File(path);

        if (file.exists()) {
            if (Desktop.isDesktopSupported()) {
                Desktop.getDesktop().open(file);
            }
            else {
                System.out.println("Awt Desktop is not supported");
            }
        }
        else {
            System.out.println("File Does not Exist");
        }
    }
    catch (IOException ex) {
        Logger.getLogger(IceDataListPanel.class.getName()).log(Level.SEVERE, "Failed to open file: {0}", ex.getMessage());
    }
}

/**
 * Opens the URI given the URI
 *
 * @param path to the file
 */
private void openURI(URI uri) throws IOException {
    if (Desktop.isDesktopSupported()) {
        Desktop.getDesktop().browse(uri);
    }
    else {
        System.out.println("Awt Desktop is not supported");
    }
}

我得到了一个标准操作系统对话框,要求一个应用程序(使用Java 7和Windows 8)。如果访问被拒绝,可能是因为运行Java程序的用户无权打开该文件

测试应用程序:

public class DesktopOpenFile {
    public static void main(String[] args) {
        openFile("huhu.orttr");
    }

    private static void openFile(String path) {
        try {
            File file = new File(path);

            if (file.exists()) {
                if (Desktop.isDesktopSupported()) {
                    Desktop.getDesktop().open(file);
                }
                else {
                    System.out.println("Awt Desktop is not supported");
                }
            }
            else {
                System.out.println("DesktopOpenFile::openFile: file = " + file.getAbsolutePath() + (file.exists() ? " - exists" : " - does not exist!"));
            }
        }
        catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

您可能对文件类型关联感兴趣

AssociationService serv = new AssociationService();
Association logassoc = serv.getFileExtensionAssociation("LOG"); // .log ?
if (logassoc == null) {
    return; // .log not a registered file type.
}

如果运行我的测试程序会发生什么情况?我得到的错误与java.io.IOException之前相同:无法打开文件:/C:/Users/angle/Desktop/test.test。错误消息:访问被拒绝。位于sun.awt.windows.WDesktopPeer.ShellExecute(WDesktopPeer.java:77)位于sun.awt.windows.WDesktopPeer.open(WDesktopPeer.java:54)位于java.awt.Desktop.Desktop.Desktop.java:272)位于desktoppenfile.desktoppenfile.openFile(desktoppenfile.java:24)位于desktoppenfile.desktoppenfile.main(desktoppenfile.java:15)可能该文件已在另一个应用程序中打开并锁定。不管怎样,正如您所看到的,代码本身在我的机器上按预期运行,您的设置一定有问题……如果您打开一个扩展名为它可以处理的文件,它就可以正常工作。对于一个扩展名为它不知道如何处理的文件,它就不能正常工作。这与文件以另一种方式被锁定或打开无关。我已经在桌面上创建了多个文件,用不同的扩展名来测试这一点,除了不受支持的扩展名之外,其他所有文件都可以工作。请考虑这样一个事实,即相同的代码在我的机器上可以正常工作(从屏幕截图中可以看到):它可以处理未向操作系统注册的扩展,并且不会引发异常。你怎么解释呢?我可以用它作为管理扩展是否受支持的一种方法,但是我不断得到错误java.lang.UnsatifiedLinkError:java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860)的java.lang.Runtime.loadLibrary0(Runtime.java:845)的java.lang.System.loadLibrary(System.java:1084)的java.library中没有jdic经过一些研究,我不再确定JDIC是否足够活跃。那将是非常可悲的。不满意的链接错误可能来自仅具有32位DLL;必须运行32位JVM。对不起,我以为JDIC会在org.jdesktop下进化。