4

このトピックには多くの混乱があります。いくつかの質問がありました。物事はまだ不明確に見えます。ClassLoader、絶対ファイルパスなど

プロジェクトディレクトリ構造が次のようになっているとします。

私のプロジェクト - 
            --dist        
            --lib
            --src
            - テスト

「lib/txt」ディレクトリに「txtfile.txt」というリソースがあります。システムに依存しない方法でアクセスしたい。プロジェクトの絶対パスが必要です。したがって、パスをabspath + "/ lib / Dictionary/txtfile.txt"としてコーディングできます。

私がこれをするとします

 java.io.File file = new java.io.File("");   //Dummy file
    String  abspath=file.getAbsolutePath();

必ずしもプロジェクトルートではない現在の作業ディレクトリを取得します。

「lib/txt/txtfile.txt」ディレクトリ構造とリソースも含む「dist」フォルダから最後の「prj.jar」を実行するとします。これもここで機能するはずです。distフォルダの絶対パスが必要です。

問題が明確であることを願っています。

4

3 に答える 3

9

この種のことには、クラスローダーを使用してgetResource()またはgetResourceAsStream()を実際に使用する必要があります。特に、これらのメソッドはClassLoaderを使用して、プロジェクト内のリソースの検索コンテキストを判別します。

getClass().getResource("lib/txtfile.txt")テキストファイルを取得するには、のようなものを指定します。

明確にするために:リソースのパスを取得する方法を考える代わりに、リソースを取得することを考える必要があります-この場合、どこかのディレクトリ(おそらくJAR内)のファイルです。この場合、絶対パスを知る必要はありません。ファイルを取得するためのURLだけを知る必要があり、ClassLoaderがこのURLを返します。ファイルへのストリームを開きたい場合は、を使用してURLをいじることなく直接これを行うことができますgetResourceAsStream

ClassLoaderを介してアクセスしようとしているリソースは、Class-Path(JARファイルのマニフェストで構成されている)上にある必要があります。これは重要です!ClassLoaderはClass-Pathを使用してリソースを検索するため、Class-Pathに十分なコンテキストを指定しないと、何も検索できません。ClassLoaderを追加.すると、リソースの参照方法に応じて、JARの内部または外部で何かを解決する必要がありますが、より具体的にすることもできます。

接頭辞がaのリソースを参照すると.、ClassLoaderはJARの外部のファイルも検索しますが、リソースパスの接頭辞がピリオドでない場合は、ClassLoaderがJARファイルの内部のみを検索するように指示されます。

つまり、JARlibの名前のディレクトリにファイルがfoo.txtあり、リソースを取得したい場合は、次のコマンドを実行します。getResource("lib/foo.txt");

同じリソースがJARの外部にある場合は、実行しますgetResource("./lib/foo.txt");

于 2010-07-09T04:50:13.100 に答える
2

まず、libディレクトリがクラスパスにあることを確認します。これを行うには、起動スクリプトにコマンドラインパラメータを追加します。

$JAVA_HOME/bin/java -classpath .:lib com.example.MyMainClass

これをMyProject/start.shまたはosに依存するスクリプトとして保存します。

次に、次のようにtextfile.txtにアクセスできます(Markが正しく言及しているとおり)。

// if you want this as a File
URL res = getClass().getClassLoader().getResource("text/textfile.txt");
File f = new File(res.getFile());

// As InputStream
InputStream in = getClass().getClassLoader()
        .getResourceAsStream("text/textfile.txt");
于 2010-07-09T05:09:54.503 に答える
0

@Markは正しいです。これは、これまでで最も単純で最も堅牢なアプローチです。

ただし、本当にが必要な場合はFile、次のことを試してみることをお勧めします。

  • システムプロパティ「java.class.path」の内容をパス名のリストに変換します。
  • ファイル名に基づいてリスト内のJARパス名を識別します。
  • 「../..」がJARパス名に関連して何であるかを把握し、「プロジェクト」ディレクトリを提供します。
  • プロジェクトディレクトリを基準にしてターゲットパスを作成します。

もう1つの方法は、プロジェクトディレクトリ名をラッパースクリプトに埋め込み、-Dオプションを使用してシステムプロパティとして設定することです。ラッパースクリプトに独自の絶対パス名を認識させることもできます。例:を使用しwhenceます。

于 2010-07-09T04:55:29.407 に答える