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

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

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

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

Следующие работы работают на Java 7 и выше (см. Здесь для документации).

 import java.nio.file.Paths; Paths.get(".").toAbsolutePath().normalize().toString(); 

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

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

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

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

Изменить: для получения абсолютного пути текущего каталога из корня файловой системы:

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

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

 File currentDir = new File(""); 

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

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

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

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

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

как объект File:

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

вы можете иметь полную квалифицированную строку, такую ​​как «D: / a / b / c»:

 getCwd().getAbsolutePath() 

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

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

Что-то вроде

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

Это не совсем так, но вы поняли. Затем System.getProperty("com.mycompany.workingDir")

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

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

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

В 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 .

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

Упомяните, что он проверяется только в 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; } 

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

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

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

Чтобы использовать, везде, где вы хотите получить базовый путь для чтения файла, вы можете передать свой class привязки вышеприведенному методу, результат может быть то, что вам нужно: D

Лучший,

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

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

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

 String path=folder.getPath(); 

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

  • Как узнать, какая реализация JAXP используется и откуда она загружена?
  • Как перенести файл из одного места в другое на Java?
  • Поймать все Исключения, а также вернуть пользовательские ошибки в Джерси
  • Действительно ли jackson не может десериализовать json в родовой тип?
  • Входные и выходные двоичные streamи с использованием JERSEY?
  • Совместить многострочный текст с использованием регулярного выражения
  • Как скопировать текст из Java-программы?
  • Когда использовать примитив и когда ссылочные типы в Java
  • Java - преобразование изображения в Base64
  • Как фильтровать строку для нежелательных символов с помощью регулярного выражения?
  • В чем разница между JSF, Servlet и JSP?
  • Interesting Posts

    Pycharm utils.py не получает подсветку синтаксиса

    Отрегулируйте компоновку, когда включена мягкая клавиатура

    Как перекосить элемент, но сохранить текст нормальным (не подверженным курку)

    В настоящий момент точка останова не будет удалена. Для этого документа в приложении Silverlight не были загружены никакие символы

    Как оптимизировать vlookup для высокого количества поиска? (альтернативы VLOOKUP)

    Как передать ArrayList <HashMap > из одной активности в другую

    Как программно спарить Bluetooth-устройство на Android

    Установите фокус на первый недопустимый ввод в форме AngularJs

    Как использовать временную метку сервера Firebase для создания даты?

    Как запустить программу еще до запуска Windows?

    jQuery draggable + droppable: как привязать упавший элемент к включенному элементу

    Директива изолирует область с областью ng-repeat в AngularJS

    Как запустить хранимые процедуры в Entity Framework Core?

    отменить порядок символов в строке

    Идентификация текста на основе вывода в PDF с использованием PDFBOX

    Давайте будем гением компьютера.