web-dev-qa-db-ja.com

Javaで現在の作業ディレクトリを取得する方法は?

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

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

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

108
Justian Meyer

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

以下は、.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 Testcurrent dir = /User/meを出力します。

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

139
user177800

CodeSource#getLocation() を使用します。これはJARファイルでも正常に機能します。 CodeSourceProtectionDomain#getCodeSource() で取得でき、ProtectionDomainClass#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()引数として渡す。

71
BalusC
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をスローしますが、../../../のようなものを削除することに注意してください

31
cyber-monk
this.getClass().getClassLoader().getResource("").getPath()
12
Peter De Winter

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

import Java.nio.file.Path;
import Java.nio.file.Paths;

...

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

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

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));
4
jmamatos

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

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

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

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

3