11

Java 1.5を使用していて、関連するアプリケーションを起動してファイルを開きたいのですが。Java1.6でDesktopAPIが導入されたことは知っていますが、Java1.5のソリューションが必要です

これまでのところ、Windowsでそれを行う方法を見つけました。

Runtime.getRuntime().exec(new String[]{ "rundll32", 
                          "url.dll,FileProtocolHandler", fileName });

それを行うためのクロスプラットフォームの方法はありますか?または、少なくともLinux用の同様のソリューションですか?

4

8 に答える 8

13
public static boolean isWindows() {
    String os = System.getProperty("os.name").toLowerCase();
    return os.indexOf("windows") != -1 || os.indexOf("nt") != -1;
}
public static boolean isMac() {
    String os = System.getProperty("os.name").toLowerCase();
    return os.indexOf("mac") != -1;
}
public static boolean isLinux() {
    String os = System.getProperty("os.name").toLowerCase();
    return os.indexOf("linux") != -1;
}
public static boolean isWindows9X() {
    String os = System.getProperty("os.name").toLowerCase();
    return os.equals("windows 95") || os.equals("windows 98");
}

 if (isLinux())
  {
     cmds.add(String.format("gnome-open %s", fileName));
     String subCmd = (exec) ? "exec" : "openURL";
     cmds.add(String.format("kfmclient "+subCmd+" %s", fileName));
  }
  else if (isMac())
  {
     cmds.add(String.format("open %s", fileName));
  }
  else if (isWindows() && isWindows9X())
  {
     cmds.add(String.format("command.com /C start %s", fileName));
  }
  else if (isWindows())
  {
     cmds.add(String.format("cmd /c start %s", fileName));
  }
于 2008-11-28T11:15:01.967 に答える
12

JDICは、Java 1.5 でデスクトップのような機能を提供するライブラリです。

于 2008-11-28T11:46:56.883 に答える
11

この答えは+1

さらに、ポリモーフィズムを使用した次の実装をお勧めします。

このように、クラス間の結合を減らすことで、新しいプラットフォームを簡単に追加できます。

クライアントコード:

 Desktop desktop = Desktop.getDesktop();

 desktop.open( aFile );
 desktop.imaginaryAction( aFile );

デスクトップの実装:

package your.pack.name;

import java.io.File;

public class Desktop{

    // hide the constructor.
    Desktop(){}

    // Created the appropriate instance
    public static Desktop getDesktop(){

        String os = System.getProperty("os.name").toLowerCase();

        Desktop desktop = new Desktop();
         // This uf/elseif/else code is used only once: here
        if ( os.indexOf("windows") != -1 || os.indexOf("nt") != -1){

            desktop = new WindowsDesktop();

        } else if ( os.equals("windows 95") || os.equals("windows 98") ){

            desktop = new Windows9xDesktop();

        } else if ( os.indexOf("mac") != -1 ) {

            desktop = new OSXDesktop();

        } else if ( os.indexOf("linux") != -1 && isGnome() ) {

            desktop = new GnomeDesktop();

        } else if ( os.indexOf("linux") != -1 && isKde() ) {

            desktop = new KdeDesktop();

        } else {
            throw new UnsupportedOperationException(String.format("The platform %s is not supported ",os) );
        }
        return desktop;
    }

    // default implementation :( 
    public void open( File file ){
        throw new UnsupportedOperationException();
    }

    // default implementation :( 
    public void imaginaryAction( File file  ){
        throw new UnsupportedOperationException();
    }
}

// One subclass per platform below:
// Each one knows how to handle its own platform   


class GnomeDesktop extends Desktop{

    public void open( File file ){
        // Runtime.getRuntime().exec: execute gnome-open <file>
    }

    public void imaginaryAction( File file ){
        // Runtime.getRuntime().exec:gnome-something-else <file>
    }

}
class KdeDesktop extends Desktop{

    public void open( File file ){
        // Runtime.getRuntime().exec: kfmclient exec <file>
    }

    public void imaginaryAction( File file ){
        // Runtime.getRuntime().exec: kfm-imaginary.sh  <file>
    }
}
class OSXDesktop extends Desktop{

    public void open( File file ){
        // Runtime.getRuntime().exec: open <file>
    }

    public void imaginaryAction( File file ){
        // Runtime.getRuntime().exec: wow!! <file>
    }
}
class WindowsDesktop extends Desktop{

    public void open( File file ){
        // Runtime.getRuntime().exec: cmd /c start <file>
    }

    public void imaginaryAction( File file ){
        // Runtime.getRuntime().exec: ipconfig /relese /c/d/e
    }
}
class Windows9xDesktop extends Desktop{

    public void open( File file ){
        //Runtime.getRuntime().exec: command.com /C start <file>
    }

    public void imaginaryAction( File file){
       //Runtime.getRuntime().exec: command.com /C otherCommandHere <file>
    }
}

これは単なる例であり、実際には、値(コマンド文字列%s)をパラメータ化するためだけに新しいクラスを作成する価値はありません。しかし、各メソッドがプラットフォーム固有の方法で別のステップを実行することを想像してみましょう。

この種のアプローチを行うと、時間の経過とともにバグが発生する可能性のある不要なif / elseif / elseコンストラクトが削除される可能性があります(コードにこれらが6つあり、変更が必要な場合は、そのうちの1つを更新するのを忘れるか、コピー/貼り付けるコマンドを変更するのを忘れる可能性があります)

于 2008-11-28T18:14:42.950 に答える
5

追加として:ではなくgnome-open、を使用しますxdg-open。これはXdgUtilsの一部であり、LSBデスクトップサポートパッケージ(3.2以降)の一部です。

gnome-openフォールバックとして引き続き使用できます(すべきです)が、 xdg-openGNOME以外のデスクトップでも機能します。

于 2008-11-28T23:45:54.873 に答える
4

SWTを使用すると、標準プログラムが次の方法でファイルを開くことができます。

final Program p = Program.findProgram(fileExtension);
p.execute(file.getAbsolutePath());

SWTはプラットフォームに依存するため、厳密にはこれはクロスプラットフォームではありませんが、プラットフォームごとに異なるSWTjarを使用できます。

于 2008-11-28T08:58:28.623 に答える
0

OSのデフォルトの方法を使用して開くことができます。

  • Windows: "cmd / c fileName
  • Linux w / gnome "gnome-open filename "
  • Linux w / Kde ??
  • OSx「ファイル名を開く」
于 2008-11-28T09:05:00.140 に答える
0

別の回答 (boutta による) では、SWT の使用が提案されています。この目的のためだけにライブラリを参照することはお勧めしませんが、すでに使用している場合は、次のコマンドを実行してください:

Program.launch("http://google.com/");

このメソッドは、オブジェクトが既に作成されているtrue場合にのみ機能する (そして を返す)ことに注意してください(たとえば、 を作成することによって)。また、メインスレッドで実行する必要があることに注意してください。例えば:DisplayShell

Display.syncExec(new Runnable() {
    public void run() {
        Program.launch("http://google.com/");
    }
});

上記の例では URL を起動しましたが、ファイルの起動も同じように機能します。

于 2010-11-17T19:19:31.143 に答える
-3

コマンドを構成ファイルのどこかに配置します。

「JARとソースコード」は「クロスプラットフォーム」になりますが、デプロイメントはそうではありません。

この答えのようなこともできます。「Deskop」実装のファクトリクラスのクラス名をセットアップファイルに入れることができます。(必要に応じて、ガイドまたはスプリングの場合があります)

于 2008-11-28T18:22:55.773 に答える