Получение текущего рабочего каталога в Java - PullRequest
910 голосов
/ 02 февраля 2011

Я хочу получить доступ к своему текущему рабочему каталогу, используя

 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 не является моим текущим каталогом.Нужна помощь в этом отношении.

Ответы [ 20 ]

12 голосов
/ 28 декабря 2013

Я в 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") документы

5 голосов
/ 02 февраля 2011

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

Что-то вроде

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

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

5 голосов
/ 25 декабря 2015

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

4 голосов
/ 18 декабря 2015

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

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

System.getProperty("user.dir");

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

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

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

3 голосов
/ 27 сентября 2012

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

3 голосов
/ 20 ноября 2016

Отметим, что это проверено только в 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'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;
    }
1 голос
/ 16 апреля 2015

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

Best

0 голосов
/ 31 марта 2015

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

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 голосов
/ 04 января 2015

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

0 голосов
/ 20 ноября 2013

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

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

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

String path=folder.getPath();
...