java.awt.Desktop.open не работает с файлами PDF? - PullRequest
4 голосов
/ 06 октября 2009

Похоже, я не могу использовать Desktop.open () для файлов PDF независимо от их местоположения. Вот небольшая тестовая программа:

package com.example.bugs;

import java.awt.Desktop;
import java.io.File;
import java.io.IOException;

public class DesktopOpenBug {
    static public void main(String[] args)
    {
        try {
            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()) {
                desktop = Desktop.getDesktop();
                for (String path : args)
                {
                    File file = new File(path);
                    System.out.println("Opening "+file);
                    desktop.open(file);
                }
            }           
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Если я запускаю DesktopOpenBug с аргументами c:\tmp\zz1.txt c:\tmp\zz.xml c:\tmp\ss.pdf (3 файла, которые у меня случайно оказались), я получаю такой результат: (файлы .txt и .xml открываются нормально)

Opening c:\tmp\zz1.txt
Opening c:\tmp\zz.xml
Opening c:\tmp\ss.pdf
java.io.IOException: Failed to open file:/c:/tmp/ss.pdf. Error message:
    The parameter is incorrect.

at sun.awt.windows.WDesktopPeer.ShellExecute(Unknown Source)
at sun.awt.windows.WDesktopPeer.open(Unknown Source)
at java.awt.Desktop.open(Unknown Source)
at com.example.bugs.DesktopOpenBug.main(DesktopOpenBug.java:21)

Что, черт возьми, происходит? Я использую WinXP, я могу набрать "c: \ tmp \ ss.pdf" в командной строке, и он открывается очень хорошо.

edit: , если это пример Ошибка Sun Java # 6764271 , пожалуйста, помогите, проголосовав за нее. Какая боль. >: (* ​​1014 *

Ответы [ 2 ]

8 голосов
/ 01 января 2011

Я никогда не знал об этой команде Desktop, до недавнего времени через этот пост:
будет ли Java Runtime.getRuntime (). Exec () работать в Windows 7?

Ранее я использовал:

Runtime.getRuntime().exec("rundll32 SHELL32.DLL,ShellExec_RunDLL "+ myfile); 

И это всегда работало для меня. Если ваш метод не работает, возможно, вы можете попробовать эту команду.

2 голосов
/ 06 октября 2009

Если вы измените порядок своих arugments, это приведет к тому, что один из других файлов получит ту же ошибку. Интересно, нужно ли обрезать конец пути перед вызовом конструктора файла.

ммм ... да игнорируй это ... проверь документацию Desktop.open. open выдает исключение ввода-вывода ", если указанный файл не имеет связанного приложения или не удается запустить связанное приложение" ... также сверху страницы ... "Механизм регистрации, доступа и запуска связанного приложения приложение зависит от платформы. "


код для класса Desktop: http://fuseyism.com/classpath/doc/java/awt/Desktop-source.html

Метод open вызывает DesktopPeer.open.

Источник DesktopPeer: http://www.jdocs.com/javase/7.b12/java/awt/peer/DesktopPeer.html

DesktopPeer зависит от конкретной реализации.

Вот источник для реализации, специфичной для Windows: http://www.java2s.com/Open-Source/Java-Document/6.0-JDK-Platform/windows/sun/awt/windows/WDesktopPeer.java.htm

open->ShellExecute->(Native)ShellExecute

Native ShellExecute - это оболочка для Win32 ShellExecute. Вот информация о функции. http://msdn.microsoft.com/en-us/library/bb762153(VS.85).aspx

Мое предложение для обходного пути было бы написать собственный смысл функции ShellExecute. Вот источник от того, кто это сделал. http://www.heimetli.ch/shellexec.html

...