1248

Javaを使用して現在の作業ディレクトリにアクセスしたい。

私のコード:

 String currentPath = new java.io.File(".").getCanonicalPath();
 System.out.println("Current dir:" + currentPath);

 String currentDir = System.getProperty("user.dir");
 System.out.println("Current dir using System:" + currentDir);

出力:

Current dir: C:\WINDOWS\system32
Current dir using System: C:\WINDOWS\system32

Cドライブが現在のディレクトリではないため、出力が正しくありません。

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

4

25 に答える 25

1365

コード :

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

これにより、アプリケーションが初期化された現在のディレクトリの絶対パスが出力されます。


説明:

ドキュメントから:

java.ioパッケージは、現在のユーザー ディレクトリを使用して相対パス名を解決します。現在のディレクトリは、システム プロパティとして表されます。つまりuser.dir、JVM が呼び出されたディレクトリです。

于 2011-09-29T21:12:33.577 に答える
475

参照:パス操作 (Java™ チュートリアル > 基本クラス > 基本 I/O)

とを使用するjava.nio.file.Pathjava.nio.file.Paths、次のようにして、Java が現在のパスと見なすものを表示できます。これは 7 以降で、NIO を使用します。

Path currentRelativePath = Paths.get("");
String s = currentRelativePath.toAbsolutePath().toString();
System.out.println("Current absolute path is: " + s);

これは以下を出力します:

Current absolute path is: /Users/george/NetBeansProjects/Tutorials

私の場合は、クラスを実行した場所です。

先頭の区切り記号を使用して絶対パスを構成していることを示すのではなく、相対的な方法でパスを構成すると、この相対パスが開始点として使用されます。

于 2013-04-11T17:10:25.723 に答える
251

以下は Java 7 以降で機能します (ドキュメントについては、こちらを参照してください)。

import java.nio.file.Paths;

Paths.get(".").toAbsolutePath().normalize().toString();
于 2014-03-12T12:03:01.137 に答える
35

これが私にとっての解決策です

File currentDir = new File("");
于 2013-05-28T23:09:41.913 に答える
30

c:\windows\system32が現在のディレクトリではないと思う理由は何ですか? プロパティは明示的に「user.dirユーザーの現在の作業ディレクトリ」になります。

別の言い方をすれば、コマンド ラインから Java を起動しない限り、c:\windows\system32はおそらく CWD です。つまり、ダブルクリックしてプログラムを起動する場合、CWD がダブルクリック元のディレクトリである可能性はほとんどありません。

編集:これは、古いウィンドウやJavaバージョンにのみ当てはまるようです。

于 2011-02-02T05:39:21.080 に答える
26

を使用し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());
    }
}
于 2014-01-22T05:20:45.633 に答える
23
this.getClass().getClassLoader().getResource("").getPath()
于 2013-05-15T13:50:15.700 に答える
19

通常、File オブジェクトとして:

File getCwd() {
  return new File("").getAbsoluteFile();
}

「D:/a/b/c」のような完全修飾文字列が必要な場合があります。

getCwd().getAbsolutePath()
于 2015-01-26T12:13:23.803 に答える
14

私はLinuxを使用していますが、これらのアプローチの両方で同じ結果が得られます:

@Test
public void aaa()
{
    System.err.println(Paths.get("").toAbsolutePath().toString());

    System.err.println(System.getProperty("user.dir"));
}

Paths.get("")ドキュメント

System.getProperty("user.dir")ドキュメント

于 2013-12-28T03:11:13.113 に答える
6

パッケージを含む現在のディレクトリにアクセスしたいことを願っています.つまり、Javaプログラムが入っc:\myApp\com\foo\src\service\MyTest.javaていて、それまで印刷したいc:\myApp\com\foo\src\service場合は、次のコードを試すことができます:

String myCurrentDir = System.getProperty("user.dir")
            + File.separator
            + System.getProperty("sun.java.command")
                    .substring(0, System.getProperty("sun.java.command").lastIndexOf("."))
                    .replace(".", File.separator);
    System.out.println(myCurrentDir);

注:このコードは、Oracle JRE を使用する Windows でのみテストされています。

于 2012-09-27T10:09:19.607 に答える
5

Linux では、ターミナルからjarファイルを実行すると、 jar ファイルがどこにあるかに関係なく、どちらも同じ: "/home/CurrentUser"を返します。jar ファイルを起動するときに、端末で使用している現在のディレクトリにのみ依存します。String

Paths.get("").toAbsolutePath().toString();

System.getProperty("user.dir");

Classwithmainが呼び出される場合はMainClass、次を試してください。

MainClass.class.getProtectionDomain().getCodeSource().getLocation().getFile();

これにより、jarファイルの絶対パスが返さStringれます。

于 2015-12-17T22:29:08.303 に答える
5

Windows user.dir を使用すると、期待どおりにディレクトリが返されますが、昇格された権限 (管理者として実行) でアプリケーションを起動すると、そうではありません。その場合、C:\WINDOWS\system32 が取得されます。

于 2015-12-25T14:42:46.937 に答える
2

eclipse、netbean、またはコマンドラインからスタンドアロンでプロジェクトを実行しようとしているとします。修正方法を書きました

public static final String getBasePathForClass(Class<?> clazz) {
    File file;
    try {
        String basePath = null;
        file = new File(clazz.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
        if (file.isFile() || file.getPath().endsWith(".jar") || file.getPath().endsWith(".zip")) {
            basePath = file.getParent();
        } else {
            basePath = file.getPath();
        }
        // fix to run inside eclipse
        if (basePath.endsWith(File.separator + "lib") || basePath.endsWith(File.separator + "bin")
                || basePath.endsWith("bin" + File.separator) || basePath.endsWith("lib" + File.separator)) {
            basePath = basePath.substring(0, basePath.length() - 4);
        }
        // fix to run inside netbean
        if (basePath.endsWith(File.separator + "build" + File.separator + "classes")) {
            basePath = basePath.substring(0, basePath.length() - 14);
        }
        // end fix
        if (!basePath.endsWith(File.separator)) {
            basePath = basePath + File.separator;
        }
        return basePath;
    } catch (URISyntaxException e) {
        throw new RuntimeException("Cannot firgue out base path for class: " + clazz.getName());
    }
}

使用するには、ファイルを読み取るためのベースパスを取得したいすべての場所で、アンカークラスを上記のメソッドに渡すことができます。結果が必要になる場合があります:D

一番、

于 2015-04-16T04:39:23.050 に答える
0

現在の作業ディレクトリは、異なる Java 実装では異なる方法で定義されています。Java 7 より前の特定のバージョンでは、作業ディレクトリを取得する一貫した方法がありませんでした。-DJava ファイルを起動し、情報を保持する変数を定義することで、これを回避できます。

何かのようなもの

java -D com.mycompany.workingDir="%0"

それはまったく正しくありませんが、アイデアはわかります。それからSystem.getProperty("com.mycompany.workingDir")...

于 2011-02-02T05:37:54.433 に答える
0

私のお気に入りの方法は、現在実行中のプロセスに関連付けられているシステム環境変数から取得することです。この場合、アプリケーションは JVM によって管理されています。

String currentDir = System.getenv("PWD");
/*
 /home/$User/Documents/java
*/

ホームディレクトリ、OSバージョンなど、役立つと思われる他の環境変数を表示するには.......

//Home directory
String HomeDir = System.getEnv("HOME");


//Outputs for unix
/home/$USER

//Device user
String user = System.getEnv("USERNAME");


//Outputs for unix
$USER

このアプローチの優れた点は、すべてのパスがすべてのタイプの OS プラットフォームに対して解決されることです。

于 2021-05-31T10:10:36.037 に答える
0

これは、混乱の瞬間が発生したときの私の特効薬です。たとえば、JVM は IDE によって別のバージョンにスリップされます。この静的関数は、現在のプロセス PID を検索し、その pid で VisualVM を開きます。あなたはそれをすべて欲しがっていて、あなたはそれを手に入れているので、混乱はそこで止まります...

  public static void callJVisualVM() {
    System.out.println("USER:DIR!:" + System.getProperty("user.dir"));
    //next search current jdk/jre
    String jre_root = null;
    String start = "vir";
    try {
        java.lang.management.RuntimeMXBean runtime =
                java.lang.management.ManagementFactory.getRuntimeMXBean();
        String jvmName = runtime.getName();
        System.out.println("JVM Name = " + jvmName);
        long pid = Long.valueOf(jvmName.split("@")[0]);
        System.out.println("JVM PID  = " + pid);
        Runtime thisRun = Runtime.getRuntime();
        jre_root = System.getProperty("java.home");
        System.out.println("jre_root:" + jre_root);
        start = jre_root.concat("\\..\\bin\\jvisualvm.exe " + "--openpid " + pid);
        thisRun.exec(start);
    } catch (Exception e) {
        System.getProperties().list(System.out);
        e.printStackTrace();
    }
}
于 2020-05-18T00:54:45.787 に答える
0

これは正確に求められているものではありませんが、重要な注意事項があります。Windows マシンで Java を実行する場合、Oracle インストーラーは「java.exe」を C:\Windows\system32 に配置します。 Java アプリケーション (PATH の前に java.exe があり、Java アプリケーションがコマンドラインから実行される場合を除く)。これが、File(".") が C:\Windows\system32 を返し続ける理由であり、macOS または *nix の実装からサンプルを実行すると、Windows とは異なる結果が返され続ける理由です。

残念ながら、JNI 呼び出しを使用して独自のネイティブ ランチャー実行可能ファイルを作成し、ネイティブ ランチャー コードから現在の作業ディレクトリを取得する場合を除き、20 年間の Java コーディングで見つけた限りでは、これに対する普遍的な正解は本当にありません。起動しました。他のすべてには、特定の状況下で壊れる可能性のあるニュアンスが少なくともいくつかあります.

于 2020-09-15T22:20:22.507 に答える
-1

ここに投稿された回答はどれもうまくいきませんでした。うまくいったのは次のとおりです。

java.nio.file.Paths.get(
  getClass().getProtectionDomain().getCodeSource().getLocation().toURI()
);

編集:私のコードの最終バージョン:

URL myURL = getClass().getProtectionDomain().getCodeSource().getLocation();
java.net.URI myURI = null;
try {
    myURI = myURL.toURI();
} catch (URISyntaxException e1) 
{}
return java.nio.file.Paths.get(myURI).toFile().toString()
于 2015-03-31T19:35:50.263 に答える