6

重複の可能性:
Javaから特定のファイルのデフォルト(ネイティブ)アプリケーションを起動する方法は?

ファイルを開くJavaアプリケーションがあります。これはWindowsでは完璧に機能しますが、Macでは機能しません。

ここでの問題は、Windows構成を使用して開くことです。コードは次のとおりです。

Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + file);

今私の質問は、Macでそれを開くためのコードは何ですか?または、マルチプラットフォームで動作するPDFを開く別の方法はありますか?

編集:

次のようにファイルを作成しました。

File folder = new File("./files");
File[] listOfFiles = folder.listFiles();

ループでそれらを配列に追加します:

fileArray.add(listOfFiles[i]);

Desktop.getDesktop()。open(file)を使用してその配列からファイルを開こうとすると、そのファイルが見つからないと表示されます(フォルダーとして「./files」を使用したため、パスが混乱しています)

4

3 に答える 3

14

オペレーティングシステム検出器は次のとおりです。

public class OSDetector
{
    private static boolean isWindows = false;
    private static boolean isLinux = false;
    private static boolean isMac = false;

    static
    {
        String os = System.getProperty("os.name").toLowerCase();
        isWindows = os.contains("win");
        isLinux = os.contains("nux") || os.contains("nix");
        isMac = os.contains("mac");
    }

    public static boolean isWindows() { return isWindows; }
    public static boolean isLinux() { return isLinux; }
    public static boolean isMac() { return isMac; };

}

次に、次のようなファイルを開くことができます。

public static boolean open(File file)
{
    try
    {
        if (OSDetector.isWindows())
        {
            Runtime.getRuntime().exec(new String[]
            {"rundll32", "url.dll,FileProtocolHandler",
             file.getAbsolutePath()});
            return true;
        } else if (OSDetector.isLinux() || OSDetector.isMac())
        {
            Runtime.getRuntime().exec(new String[]{"/usr/bin/open",
                                                   file.getAbsolutePath()});
            return true;
        } else
        {
            // Unknown OS, try with desktop
            if (Desktop.isDesktopSupported())
            {
                Desktop.getDesktop().open(file);
                return true;
            }
            else
            {
                return false;
            }
        }
    } catch (Exception e)
    {
        e.printStackTrace(System.err);
        return false;
    }
}

あなたの編集への答え:

file.getAbsoluteFile()またはを使用してみてくださいfile.getCanonicalFile()

于 2011-08-11T10:42:51.540 に答える
13

最初は、*。dllに関連するものはすべてWindowsっぽいです。

おそらく、Linux用に以下のコードを試すことができますが、MACでも機能する可能性があります。

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

Desktop d = Desktop.getDesktop();  
d.open(new File("foo.pdf"))
于 2011-08-11T10:08:59.333 に答える
3

開いているコマンドを確認する必要があるので、

Runtime.getRuntime().exec("/usr/bin/open " + file);

Martijnによる編集
これは、ファイルパスにスペースを使用する場合に適しています。

Runtime.getRuntime().exec(new String[]{"/usr/bin/open", file.getAbsolutePath()});
于 2011-08-11T10:08:17.707 に答える