web-dev-qa-db-ja.com

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

現在の作業ディレクトリにアクセスしたい

 String current = new Java.io.File( "." ).getCanonicalPath();
        System.out.println("Current dir:"+current);
 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ドライブは私の現在のディレクトリではないので、私の出力は正しくありません。この点で助けが必要です。

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

これはあなたのアプリケーションが初期化された場所から 完全な絶対パスを表示します。

1015
Anuj Patel

参照してください: http://docs.Oracle.com/javase/tutorial/essential/io/pathOps.html

Java.nio.file.PathJava.nio.file.Pathsを使って、次のようにして、Javaが現在のパスであると考えていることを示すことができます。これは7以降で、NIOを使用しています。

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

これはCurrent relative path is: /Users/george/NetBeansProjects/Tutorialsを出力します。私の場合は、そこからクラスを実行したところです。絶対パスを作成していることを示すために先行の区切り文字を使用しないで相対パスを作成する場合は、この相対パスを開始点として使用します。

337
geoO

以下はJava 7以降で動作します(ドキュメントは here を参照)。

import Java.nio.file.Paths;

Paths.get(".").toAbsolutePath().normalize().toString();
208
Dmitry Bespalov

これであなたの現在の作業ディレクトリのパスがわかります。

Path path = FileSystems.getDefault().getPath(".");

これにより、作業ディレクトリ内の "Foo.txt"というファイルへのパスがわかります。

Path path = FileSystems.getDefault().getPath("Foo.txt");

編集: 現在のディレクトリの絶対パスを取得するには、次の手順を実行します。

Path path = FileSystems.getDefault().getPath(".").toAbsolutePath();
49
Mark

これは私のための解決策です

File currentDir = new File("");
32
user2430452

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

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

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

30
Paul Wagland

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());
    }
}
25
Amin Bahiraei

私はコメントでこの解決策を見つけました。

String cwd = new File("").getAbsolutePath();
23
freedev
this.getClass().getClassLoader().getResource("").getPath()
23
Peter De Winter

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

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

"D:/ a/b/c"のような完全修飾文字列が欲しいかもしれません:

getCwd().getAbsolutePath()
17
comeGetSome

私はLinuxを使っていて、以下の両方のアプローチで同じ結果が得られます。

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

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

Paths.get("") docs

System.getProperty("user.dir") docs

12
Bohdan

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

何かのようなもの

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

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

5
MJB

Linux terminal から jar ファイルを実行すると、両方とも同じStringを返します。 "/ home/CurrentUser" jarファイルはどこにありますか。 jarファイルを起動するときに、端末で現在どのディレクトリを使用しているかによって異なります。

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

System.getProperty("user.dir");

Classを持つmainMainClassと呼ばれる場合は、次のことを試してください。

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

これは jar ファイルの 絶対パス を持つStringを返します。

4
Jan Povolný

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

4
SijeDeHaan

これはWindowsでのみチェックされますが、他のオペレーティングシステムでも完璧に動作すると思います[Linux,MacOs,Solaris] :)。


同じディレクトリに 2 .jarファイルがありました。 1つの.jarファイルから、同じディレクトリーにあるもう1つの.jarファイルを開始したいと思いました。

問題は、cmdから起動すると、現在のディレクトリがsystem32になることです。


警告!

  • 以下は、;][[;'57f2g34g87-8+9-09!2#@!$%^^&()()%&$%^@#というフォルダー名でも、私が行ったすべてのテストでうまくいくようです。
  • 以下のようにProcessBuilderを使っています。

???? ..

//The class from which i called this was the class `Main`
String path = getBasePathForClass(Main.class);
String applicationPath=  new File(path + "application.jar").getAbsolutePath();


System.out.println("Directory Path is : "+applicationPath);

//Your know try catch here
//Mention that sometimes it doesn't work for example with folder `;][[;'57f2g34g87-8+9-09!2#@!$%^^&()` 
ProcessBuilder builder = new ProcessBuilder("Java", "-jar", applicationPath);
builder.redirectErrorStream(true);
Process process = builder.start();

//...code

???? getBasePathForClass(Class<?> classs)

    /**
     * Returns the absolute path of the current directory in which the given
     * class
     * file is.
     * 
     * @param classs
     * @return The absolute path of the current directory in which the class
     *         file is.
     * @author GOXR3PLUS[StackOverFlow user] + bachden [StackOverFlow user]
     */
    public static final String getBasePathForClass(Class<?> classs) {

        // Local variables
        File file;
        String basePath = "";
        boolean failed = false;

        // Let's give a first try
        try {
            file = new File(classs.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());

            if (file.isFile() || file.getPath().endsWith(".jar") || file.getPath().endsWith(".Zip")) {
                basePath = file.getParent();
            } else {
                basePath = file.getPath();
            }
        } catch (URISyntaxException ex) {
            failed = true;
            Logger.getLogger(classs.getName()).log(Level.WARNING,
                    "Cannot firgue out base path for class with way (1): ", ex);
        }

        // The above failed?
        if (failed) {
            try {
                file = new File(classs.getClassLoader().getResource("").toURI().getPath());
                basePath = file.getAbsolutePath();

                // the below is for testing purposes...
                // starts with File.separator?
                // String l = local.replaceFirst("[" + File.separator +
                // "/\\\\]", "")
            } catch (URISyntaxException ex) {
                Logger.getLogger(classs.getName()).log(Level.WARNING,
                        "Cannot firgue out base path for class with way (2): ", ex);
            }
        }

        // 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 netbeans
        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;
    }
3
GOXR3PLUS

私はあなたがあなたの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でのみテストされています。

3
JSS

プロジェクトを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

ベスト、

1
bachden

ここに投稿された答えのどれも私のために働きませんでした。これはうまくいったことです:

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()
0
VenerableAgents