Javaで現在の作業ディレクトリを取得するにはどうすればよいですか?


112

メインクラスがにあるとしC:\Users\Justian\Documents\ます。プログラムが入っていることを示すにはどうすればよいC:\Users\Justian\Documentsですか?

ハードコーディングはオプションではありません。別の場所に移動する場合は、適応可能にする必要があります。

一連のCSVファイルをフォルダーにダンプし、プログラムにすべてのファイルを認識させてから、データをロードして操作します。そのフォルダに移動する方法を知りたいだけです。



1
メインクラスがjarファイルにある場合はどうなりますか?その場合、どのような結果が必要ですか?
マティアスニルソン

1
とにかくこれを行う必要があるのはなぜですか?
Ed S.

1
あなたが必要としているのはCSVファイルが置かれているディレクトリであり、.jarファイルがそのディレクトリを参照できるようにしています、そうである場合は私の答えを参照してください。

回答:


149

1つの方法は、「プロパティが初期化されたときの現在の作業ディレクトリ」を与えるシステムプロパティ を使用System.getProperty("user.dir");することです。これはおそらくあなたが望むものです。java実際の.jarファイルがマシン上の別の場所にある場合でも、コマンドが発行された場所(処理するファイルがあるディレクトリ)を確認します。実際の.jarファイルのディレクトリがあっても、ほとんどの場合、それほど役に立ちません。

以下は、.classファイルがどこにあるか、.classまたは.jarファイルに関係なく、コマンドが呼び出された場所から現在のディレクトリを出力します。

public class Test
{
    public static void main(final String[] args)
    {
        final String dir = System.getProperty("user.dir");
        System.out.println("current dir = " + dir);
    }
}  

あなたがしている場合は/User/me/、上のコードを含むあなたの.jarファイルがである/opt/some/nested/dir/ コマンドjava -jar /opt/some/nested/dir/test.jar Testが出力されますcurrent dir = /User/me

おまけとして、優れたオブジェクト指向のコマンドライン引数パーサーを使用する方法についても見てください。Java Simple Argument ParserであるJSAPを強くお勧めします。これにより、動作をオーバーライドするためにSystem.getProperty("user.dir")、別の何かを使用して渡すことができます。はるかに保守可能なソリューション。これにより、処理するディレクトリを渡すのが非常に簡単になり、user.dir何も渡されなかった場合にフォールバックできるようになります。


できる限りこれをテストします。私は本当に.jarの問題に夢中になっています:P
Justian Meyer

.jarの問題に対する私の回答のリンクにアクセスしましたか?ここで、ANTを使用して.jarファイルを構築する方法を示していますか?

システムプロパティから現在の作業ディレクトリの絶対パスを返すJarrodのコードuser.dirは、非常に使いやすくなっています。System.getProperty( "user.dir");

74

を使用しCodeSource#getLocation()ます。これはJARファイルでも問題なく機能します。あなたは得ることができCodeSourceによってProtectionDomain#getCodeSource()ProtectionDomain順番にすることによって得ることができますClass#getProtectionDomain()

public class Test {
    public static void main(String... args) throws Exception {
        URL location = Test.class.getProtectionDomain().getCodeSource().getLocation();
        System.out.println(location.getFile());
    }
}

OPのコメントに従って更新します

一連のCSVファイルをフォルダーにダンプし、プログラムにすべてのファイルを認識させてから、データをロードして操作します。そのフォルダに移動する方法を知りたいだけです。

そのためには、プログラム内での相対パスをハードコーディング/認識する必要があります。そのパスをクラスパスに追加して、使用できるようにすることを検討してください。ClassLoader#getResource()

File classpathRoot = new File(classLoader.getResource("").getPath());
File[] csvFiles = classpathRoot.listFiles(new FilenameFilter() {
    @Override public boolean accept(File dir, String name) {
        return name.endsWith(".csv");
    }
});

または、そのパスをmain()引数として渡します。


3
+1。これを機能させるにはいくつかの条件があります。最も重要なのは、「メインクラス」がファイルシステムから読み込まれることです。Javaでは、この仮定が誤っていることは、それほど珍しいことではありません。ただし、ファイルシステムのJARからクラスを確実にロードしている場合は、これが機能する方法です。
エリクソン

それはすべて、本当に異なります。私はよしようとしてコンパイルするには私のJARを取得するには、それは現時点では別の問題です。あなたがそれを助けることができると思うなら、チェックアウトしてください:stackoverflow.com/questions/3152240/…。これを投稿することはある種の違反だと私は確信していますが、これはこの問題に関連しています。私がそれを修正することができれば、これは確かに私の答えです。
Justian Meyer、2010

なぜそれをハードコーディングする必要があるのですか?以前にも同じようなことをしたことがある。私のjarとフォルダーは常に同じ関係(つまり、同じディレクトリ内)にあると仮定します。これが本当なら、jarのディレクトリを取得し、それを変更してフォルダを見つけることができます。
Justian Meyer、2010

JARファイルと同じフォルダーにある場合は、すでにクラスパスにあります。「ハードコーディング」という言葉は少し誇張されていますが、実際には「JARファイルに対する相対パスを知っている」という意味でした。
BalusC 2010年

1
@メビウス:えっ?Javaは初めてですか?javadocを確認してくださいgetLocation()メソッドから返されたものをそのまま使用してください。他のものは明らかに機能しないでしょう。
BalusC 2014

31
File currentDirectory = new File(new File(".").getAbsolutePath());
System.out.println(currentDirectory.getCanonicalPath());
System.out.println(currentDirectory.getAbsolutePath());

次のようなものを出力します:

/path/to/current/directory
/path/to/current/directory/.

File.getCanonicalPath()チェックされたIOException をスローする ことに注意してください。../../../


13
this.getClass().getClassLoader().getResource("").getPath()

これは、「bin」だけでなく、「bin / classes /」へのパスを返すことに注意してください。
Android開発者、

Intellij Ideaを使用して実行中のアプリケーションをデバッグしているときに、「/ C:/Program%20Files/Java/jdk1.8.0_112/:」を返しました
速度

5

私はちょうど使用しました:

import java.nio.file.Path;
import java.nio.file.Paths;

...

Path workingDirectory=Paths.get(".").toAbsolutePath();

9
あなたはそれが機能していません、これは正しいですPaths.get("").toAbsolutePath();
Kra

@ToKraもし私がPaths.get("my/file").toAbsolutePath()得るなら/my/file、それは間違いなくcwdではありません。
abergmeier 2017年

1
@abergmeier私は「」文字列ではない「私の/ファイル」を書いた
へKraの

5

現在の作業ディレクトリを取得する場合は、次の行を使用します

System.out.println(new File("").getAbsolutePath());

4

現在のソースコードの絶対パスが必要な場合、私の提案は次のとおりです。

String internalPath = this.getClass().getName().replace(".", File.separator);
String externalPath = System.getProperty("user.dir")+File.separator+"src";
String workDir = externalPath+File.separator+internalPath.substring(0, internalPath.lastIndexOf(File.separator));

IDEで実行したり、インスタンスをスピンするために何かを使用したりすると、これは機能しません。
Sarp Kaya、2015

内部パスはjava \ lang \ Class外部パスはE:\ BranchProduction1.4.0 \ FilesTestProject \ src作業ディレクトリはE:\ BranchProduction1.4.0 \ FilesTestProject \ src \ java \ lang出力を説明できますか?
JAVA

3

メインクラスはローカルハードディスクのファイルにあると誰が言っていますか?クラスはJARファイル内にバンドルされることが多く、ネットワーク経由でロードされることもあれば、オンザフライで生成されることもあります。

では、実際にやりたいことは何ですか?おそらく、クラスがどこから来たのかを想定しない方法があります。


一連のCSVファイルをフォルダーにダンプし、プログラムにすべてのファイルを認識させてから、データをロードして操作します。そのフォルダに移動する方法を知りたいだけです。
Justian Meyer

多分私は何かが足りないのですが、絶対パスがうまくいくようです。ハードコードすることはできないとおっしゃっていましたが、最初にどのフォルダーを確認すればよいのでしょうか。
Chris Thompson

さて、問題は自分のコンピュータだけでなく、他のコンピュータにも持って行きたいということです。パスがどのようにハードコーディングされるかわかりません。「私のjarファイルとフォルダは常に同じ関係(つまり、同じディレクトリ内)にあると仮定します。これが当てはまる場合、jarのディレクトリを取得し、それを変更してフォルダを見つけることができます。」ハードコードできる唯一の方法は、ハードドライブからファイルへの完全なパスを含める必要がない場合です。多分私は3つのフォルダだけ戻ることができます(つまり "Documents \ Project \ Dump \ [file / folder]")
Justian Meyer

あなたがしたいことは、jarファイルが存在するディレクトリへのハンドルを取得することです。それであなたの要件は達成されますか?
Chris Thompson
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.