Получение текущего рабочего каталога в 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 не является моим текущим каталогом. Нужна помощь в этом отношении.
- Эффективный размер экрана с Java
- Что такое PermSize в Java?
- Как вызвать функцию или процедуру Oracle с помощью Hibernate (EntityManager) или JPA 2
- Пользовательский пул streamов в параллельном streamе Java 8
- Анализ XML с помощью XPath в Java
- Как приостановить и возобновить stream в Java из другого streamа
- Маскирование ввода пароля с консоли: Java
- Таймер обратного отсчета Java Swing Timer
- Java AES 128 по-разному шифрует openssl
- Что определяет количество streamов, создаваемых Java ForkJoinPool?
- Как вручную принудительно совершить фиксацию в методе @Transactional?
- Конструктор Date (...) устарел. Что это значит? (Ява)
- Как получить IP-адрес из HTTP-заголовка в Java
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")