Получение текущего рабочего каталога в 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);

OutPut:

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

Мой вывод неверен, потому что диск C не является моим текущим каталогом. Нужна помощь в этом отношении.

Ответ 1

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

Здесь будет напечатан полный абсолютный путь , от которого было инициализировано ваше приложение.

Ответ 2

Смотрите: http://docs.oracle.com/javase/tutorial/essential/io/pathOps.html

Используя java.nio.file.Path и java.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, что в моем случае я запускал класс. Построить пути относительно, не используя ведущий разделитель, чтобы указать, что вы строите абсолютный путь, будет использовать этот относительный путь как отправную точку.

Ответ 3

Ниже описаны работы на Java 7 и выше (см. здесь для документации).

import java.nio.file.Paths;

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

Ответ 4

Это даст вам путь вашего текущего рабочего каталога:

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

И это даст вам путь к файлу с именем "Foo.txt" в рабочем каталоге:

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

Изменить: Чтобы получить абсолютный путь к текущему каталогу:

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

Ответ 5

Это решение для меня

File currentDir = new File("");

Ответ 6

Что заставляет вас думать, что c:\windows\system32 не является вашим текущим каталогом? Свойство user.dir явно должно быть "текущим рабочим каталогом пользователя".

Другими словами, если вы не запускаете Java из командной строки, c:\windows\system32, вероятно, является вашим CWD. То есть, если вы дважды щелкнете, чтобы запустить свою программу, CWD вряд ли будет каталогом, из которого вы дважды щелкнете.

Редактировать: Похоже, что это верно только для старых версий Windows и/или Java.

Ответ 7

Используйте 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());
    }
}

Ответ 8

Я нашел это решение в комментариях, которое лучше других и более переносимо:

String cwd = new File("").getAbsolutePath();

Ответ 9

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

Ответ 10

обычно, как объект File:

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

вам может потребоваться полная строка, например "D:/a/b/c":

getCwd().getAbsolutePath()

Ответ 11

Я нахожусь в 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

Текущий рабочий каталог определяется по-разному в разных реализациях Java. Для определенной версии до Java 7 не было последовательного способа получить рабочий каталог. Вы можете обойти это, запустив файл Java с помощью -D и определяя переменную для хранения информации

Что-то вроде

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

Это не совсем правильно, но вы поняли эту идею. Тогда System.getProperty("com.mycompany.workingDir")...

Ответ 13

Использование Windows user.dir возвращает каталог, как ожидалось, но НЕ, когда вы запускаете приложение с повышенными правами (запускаетесь как admin), в этом случае вы получаете C:\WINDOWS\system32

Ответ 14

В Linux, когда вы запустите файл jar из терминала, оба они вернут тот же String: "/home/CurrentUser" , независимо от того, где находится файл jar jar. Это зависит только от того, какой текущий каталог вы используете с вашим терминалом, когда вы запускаете файл jar.

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

System.getProperty("user.dir");

Если ваш Class с main будет называться MainClass, попробуйте:

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

Это вернет String с абсолютным путем файла jar.

Ответ 15

Надеюсь, вы хотите получить доступ к текущему каталогу, включая пакет i.e. Если ваша программа 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);

Примечание. Этот код тестируется только в Windows с Oracle JRE.

Ответ 16

Упомяните, что он проверяется только в Windows, но я думаю, что он отлично работает на других операционных системах [Linux,MacOs,Solaris]:).


У меня были файлы 2 .jar в том же каталоге. Я хотел от одного файла .jar запустить другой файл .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 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;
    }

Ответ 17

Предположим, что вы пытаетесь запустить проект внутри 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

Бест,

Ответ 18

Ни один из ответов, размещенных здесь, не работал у меня. Вот что работало:

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

Ответ 19

Это зависит от контекста (веб-приложение или Jar)

1- Если вы запускаете проект как Jar

 String cwd = new File("").getAbsolutePath();
 System.out.println(cwd);

 Path currentRelativePath = Paths.get("");
 String s = currentRelativePath.toAbsolutePath().toString();
 System.out.println(s);

 System.out.println(System.getProperty("user.dir"));

Они будут работать в jar-приложении, но не в веб-приложении.

Для веб-приложения вы должны использовать (допустим, что ActualClass является текущим классом, в котором вы работаете):

URL resource = ActualClass.class.getClassLoader().getResource(".");
System.out.println(resource.getPath());

Если у вас нет способа узнать контекст, то вам следует как-то предоставить, AFAIK. Надеюсь, это поможет.

Ответ 20

System.getProperty("java.class.path")

Ответ 21

это текущее имя каталога

String path="/home/prasad/Desktop/folderName";
File folder = new File(path);
String folderName=folder.getAbsoluteFile().getName();

это текущий путь к каталогу

String path=folder.getPath();